组合模式
类图
比较简单,直接上代码
代码
<?php // Component接口,定义了叶子和组合对象的共同操作interface Component{ public function operation(): string;} // 叶子节点,表示组合的最基本单元class Leaf implements Component{ private $name; public function __construct($name) { $this->name = $name; } public function operation(): string { return "Leaf " . $this->name; }} // 组合节点,表示可以包含其他叶子或组合的对象class Composite implements Component{ private $children = []; public function add(Component $component) { $this->children[] = $component; } public function remove(Component $component) { $this->children = array_filter($this->children, function ($child) use ($component) { return $child !== $component; }); } public function operation(): string { $result = "Composite ("; foreach ($this->children as $child) { $result .= $child->operation() . " "; } $result = rtrim($result) . ")"; return $result; }} // 客户端代码可以统一处理组合和叶子对象function clientCode(Component $component){ echo "RESULT: " . $component->operation() . "\n";} // 创建叶子对象$leaf1 = new Leaf("A");$leaf2 = new Leaf("B"); // 创建组合对象$composite = new Composite();$composite->add($leaf1);$composite->add($leaf2); // 创建更大的组合对象$composite2 = new Composite();$composite2->add($composite);$composite2->add(new Leaf("C")); echo "Client: I've got a simple component:\n";clientCode($leaf1); echo "\nClient: Now I've got a composite tree:\n";clientCode($composite2);