定義
組合多個物件形成樹形結構以表示具有“整體—部分”關係的層次結構。
組合模式對單個物件(即葉子物件)和組合物件(即容器物件)的使用具有一致性,組合模式又可以稱為“整體—部分”(Part-Whole)模式。
設計的原則和思想
- 解耦的是客戶程式與複雜元素內部結構。
- 不變部分是元素之間的層次結構,變化部分是元素。
- 核心思想是組合多個物件形成樹形結構以表示具有“整體—部分”關係的層次結構。
一句話概括設計模式
元素與元素之間形成“整體—部分”的層次結構。
結構中包含的角色
- Component(抽象構件)
- Leaf(葉子構件)
- Composite(容器構件)
最小可表達程式碼
abstract class Component
{
public abstract function operation();
}
class Leaf extends Component
{
public function operation()
{
echo '我是葉子';
}
}
class Composite extends Component
{
private $components = [];
public function add(Component $component)
{
$this->components[] = $component;
}
public function operation()
{
foreach ($this->components as $component) {
$component->operation();
}
}
}
$composite = new Composite();
$composite->add(new Leaf);
$composite->operation();
優點
- 節點自由增加。
- 可以利用多型和遞迴機制更方便地使用複雜樹結構。
- 方便對整個層次結構進行控制。
缺點
- 葉子和樹枝的宣告都是實現類,違反了依賴倒置原則。
- 對於功能差異較大的類, 提供公共介面或許會有困難。
- 在增加新構件時很難對容器中的構件型別進行限制。
何時使用
- 具有部分-整體層次結構(樹形結構)。
- 以相同方式處理簡單和複雜元素。
實際應用場景
- 檔案系統。
- 公司的組織結構。
- 在XML解析。
本作品採用《CC 協議》,轉載必須註明作者和本文連結