極簡設計模式-組合模式

long2ge發表於2021-12-04

定義

組合多個物件形成樹形結構以表示具有“整體—部分”關係的層次結構。
組合模式對單個物件(即葉子物件)和組合物件(即容器物件)的使用具有一致性,組合模式又可以稱為“整體—部分”(Part-Whole)模式。

設計的原則和思想

  1. 解耦的是客戶程式與複雜元素內部結構。
  2. 不變部分是元素之間的層次結構,變化部分是元素。
  3. 核心思想是組合多個物件形成樹形結構以表示具有“整體—部分”關係的層次結構。

一句話概括設計模式

元素與元素之間形成“整體—部分”的層次結構。

結構中包含的角色

  1. Component(抽象構件)
  2. Leaf(葉子構件)
  3. 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();

優點

  1. 節點自由增加。
  2. 可以利用多型和遞迴機制更方便地使用複雜樹結構。
  3. 方便對整個層次結構進行控制。

缺點

  1. 葉子和樹枝的宣告都是實現類,違反了依賴倒置原則。
  2. 對於功能差異較大的類, 提供公共介面或許會有困難。
  3. 在增加新構件時很難對容器中的構件型別進行限制。

何時使用

  1. 具有部分-整體層次結構(樹形結構)。
  2. 以相同方式處理簡單和複雜元素。

實際應用場景

  1. 檔案系統。
  2. 公司的組織結構。
  3. 在XML解析。
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Long2Ge

相關文章