Treci la conținutul principal

Ce este

Șablonul Composite tratează lucrurile individuale și grupurile de lucruri prin aceeași interfață. Un fișier are o dimensiune; un folder plin de fișiere (și de foldere) are și el o dimensiune — așa că ambele implementează size(), iar codul care însumează dimensiuni nu întreabă niciodată pe care dintre ele îl ține.

Compozitele formează în mod natural arbori: grupurile conțin foi și alte grupuri, pe oricâte niveluri.


Exemplu: fișiere și foldere

Interfața Item are o singură metodă. Un fișier răspunde cu dimensiunea proprie; un folder întreabă tot ce se află în interior și adună — recursivitatea apare gratuit.

O singură interfață pentru foaie și pentru grup

$root->size() parcurge întregul arbore fără nicio verificare de tip: folderul nu îi pasă dacă un element este un fișier de 4 KB sau un alt folder care ascunde încă zece.

Prompt
Scrie un script PHP cu șablonul Composite: o interfață Item cu o metodă size, o foaie File cu o dimensiune fixă și un Folder care conține Item-uri și însumează recursiv dimensiunile lor. Construiește un arbore mic (un folder rădăcină cu un fișier și un folder docs care ține două fișiere) și afișează dimensiunea lui docs și a lui root.
Ieșire: script PHP
One interface for leaf and group

Când să îl folosești

Folosește-l pentru date în formă de arbore, unde grupurile și elementele individuale răspund la aceleași întrebări — sisteme de fișiere, meniuri cu submeniuri, aranjamente de interfață, organigrame.

Renunță la el pentru liste plate. Un tablou parcurs cu o buclă nu are nevoie de niciun șablon.


Avantaje și dezavantaje

Avantaje: codul client rămâne plat și simplu; arborii de orice adâncime vin gratuit; noile clase de foaie sau de grup se conectează la aceeași interfață.

Dezavantaje: interfața comună poate impune metode nepotrivite pe foi (ce înseamnă „adaugă copil” pentru un fișier?); compozitele foarte generale devin greu de constrâns.