Wzorce projektowe – Composite
Założenie: Stworzymy prosty przykład wzorca Composite, który pozwoli nam reprezentować zarówno pojedyncze elementy, jak i grupy elementów w drzewiastej strukturze.
Krok po kroku:
- Definicja interfejsu Component: Ten interfejs zdefiniuje metody wspólne dla wszystkich elementów, zarówno pojedynczych, jak i złożonych.
- Klasa Leaf (liść): Reprezentuje pojedynczy element w strukturze.
- Klasa Composite (złożony): Reprezentuje grupę elementów. Zawiera metodę dodawania i usuwania elementów podrzędnych.
- Użycie: Tworzymy kilka liści i komponujemy je w strukturę drzewiastą.
interface Component {
public function operation(): string;
}
class Leaf implements Component {
private string $name;
public function __construct(string $name) {
$this->name = $name;
}
public function operation(): string {
return "Liść: " . $this->name;
}
}
class Composite implements Component {
private array $children = [];
public function add(Component $component): void {
$this->children[] = $component;
}
public function remove(Component $component): void {
$key = array_search($component, $this->children, true);
if ($key !== false) {
unset($this->children[$key]);
}
}
public function operation(): string {
$result = "Złożony: (";
foreach ($this->children as $child) {
$result .= $child->operation() . ", ";
}
$result = rtrim($result, ", "); // Usuwa końcową przecinek i spację
$result .= ")";
return $result;
}
}
$leaf1 = new Leaf("Liść A");
$leaf2 = new Leaf("Liść B");
$leaf3 = new Leaf("Liść C");
$composite1 = new Composite();
$composite1->add($leaf1);
$composite1->add($leaf2);
$composite2 = new Composite();
$composite2->add($leaf3);
$composite2->add($composite1);
echo $composite2->operation(); // Wyświetli: Złożony: (Liść C, Złożony: (Liść A, Liść B))
Ten przykład pokazuje podstawowe zastosowanie wzorca Composite. Zachęcamy do dalszego zgłębiania tematu i eksperymentowania z bardziej złożonymi strukturami.