Treci la conținutul principal

Ce este

Șablonul Compozit (Composite) tratează elementele individuale și grupurile de elemente prin aceeași interfață. Un fișier are o dimensiune; un dosar plin de fișiere (și dosare) are și el o dimensiune — așa că amândouă implementează size(), iar codul care adună dimensiunile nu întreabă niciodată ce tip de obiect are în mână.

Compozitele formează în mod natural arbori: grupurile conțin frunze și alte grupuri, la orice adâncime.


Exemplu: fișiere și dosare

Protocolul Item are o singură metodă. Un fișier răspunde cu propria dimensiune; un dosar întreabă tot ce conține și adună rezultatele — recursivitatea apare de la sine.

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

root.size() parcurge tot arborele fără nicio verificare de tip: dosarului nu-i pasă dacă un element este un fișier de 4 KB sau un alt dosar care ascunde încă zece.

Prompt
Scrie un program Python cu șablonul Compozit: un protocol Item cu o metodă size, o frunză File cu o dimensiune fixă în KB și un Folder care conține elemente și le adună dimensiunile recursiv. Construiește un arbore mic (un dosar rădăcină cu un fișier și un dosar docs care conține două fișiere) și afișează dimensiunea lui docs și a lui root.
Ieșire: program Python complet
One interface for leaf and group

Când să-l folosești

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

Evită-l pentru liste simple. O listă 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 de la sine; noile clase de frunze sau de grupuri se conectează la același protocol.

Dezavantaje: protocolul comun poate impune frunzelor metode ciudate (ce înseamnă „adaugă copil” pentru un fișier?); compozitele foarte generale devin greu de restricționat.