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.
Ieșire: program Python complet
from dataclasses import dataclass, field
from typing import Protocol
class Item(Protocol):
def size(self) -> int: ...
@dataclass
class File:
name: str
kb: int
def size(self) -> int:
return self.kb
@dataclass
class Folder:
name: str
items: list[Item] = field(default_factory=list)
# Dimensiunea unui dosar este suma a tot ce conține — fișiere sau dosare.
def size(self) -> int:
return sum(item.size() for item in self.items)
docs = Folder("docs", [
File("notes.txt", 4),
File("plan.md", 6),
])
root = Folder("root", [
File("readme.md", 2),
docs,
])
print("Dimensiunea docs:", docs.size(), "KB")
print("Dimensiunea root:", root.size(), "KB")
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.