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.
Ieșire: script PHP
<?php
interface Item {
public function size(): int;
}
class File implements Item {
public function __construct(
private string $name,
private int $size,
) {}
public function size(): int {
return $this->size;
}
}
class Folder implements Item {
public function __construct(
private string $name,
private array $items,
) {}
// Dimensiunea unui folder este suma tuturor elementelor din interior — fișiere sau foldere.
public function size(): int {
$total = 0;
foreach ($this->items as $item) {
$total += $item->size();
}
return $total;
}
}
$docs = new Folder("docs", [
new File("notes.txt", 4),
new File("plan.md", 6),
]);
$root = new Folder("root", [
new File("readme.md", 2),
$docs,
]);
echo "dimensiune docs: ", $docs->size(), " KB\n";
echo "dimensiune root: ", $root->size(), " KB\n";
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.