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 cu fișiere (și foldere) are și el o dimensiune — așa că amândouă implementează Size(), iar codul care adună dimensiunile nu întreabă niciodată pe care dintre ele îl ține.

Compozitele formează în mod natural arbori: grupurile conțin frunze și alte grupuri, oricât de adânc.


Exemplu: fișiere și foldere

Interfața Item are o singură metodă. Un fișier răspunde cu propria dimensiune; un folder întreabă tot ce se află înăuntru și adună — recursivitatea apare de la sine.

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

root.Size() parcurge tot arborele fără nicio verificare de tip: folderului nu îi pasă dacă un element este un fișier de 4 KB sau alt folder care mai ascunde zece.

Prompt
Scrie un program Go cu șablonul Composite: o interfață Item cu o metodă Size, o frunză File cu o dimensiune fixă și un Folder care conține Items și le însumează recursiv dimensiunile. Construiește un arbore mic (un folder root 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: program Go și rezultatul capturat
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 slice cu o buclă nu are nevoie de niciun șablon.


Avantaje și dezavantaje

Avantaje: codul client rămâne simplu și fără ramificații; arborii de orice adâncime vin gratis; tipuri noi de frunze sau de grupuri se conectează la aceeași interfață.

Dezavantaje: interfața comună poate impune frunzelor metode nepotrivite (ce înseamnă „adaugă copil” pentru un fișier?); compozitele foarte generale devin greu de ținut sub control.