目的/使用時機

  • 需要處理樹狀階層的架構(由子節點、父節點排列組成)。

  • 讓客戶端能使用一致的方式操作整個樹狀結構內容。


Participants

  • Component: 定義此樹狀結構的操作介面,用來給 Leaf/Composite 繼承使用。

  • Leaf: 作為樹狀階層的最後節點,其內沒有 child components。

  • Composite: 可視為 container,裡面有 child components(由 Leaf 或其他 composite 組成),會實作管理子物件的方法,如 Add(Component), Remove(Component)。


UML

Uniformity

Type Safety


說明

組合模式有兩種:

Uniformity,也有人說透明式,於介面(Component)內宣告管理子物件的方法(Add(), Remove()),好處是 client 不需要分辨 Leaf 還是 Composite,對 client 來說操作方式都是一致的(透明的);缺點是 Leaf 並不需要實作 Add(), Remove()等管理子物件的方法…,client 有可能會誤操作,所以較有安全性的疑慮。

另一種為 Type Safety,將管理子物件的操作下放到 Composite,缺點為 client 調用時需增加對應的判斷。


優點

  • client 端使用方式較統一。

  • 透過使用多型及遞迴來處理複雜的樹狀結構。

  • 遵循 component interface 則可導入新的 element,不需要修改既有內容 ,符合開放封閉原則。


缺點

  • 當節點 element 的特性差異較大時,可能會訂出較複雜的 component interface(為了符合所有 Leaf 或 Composite),增加程式理解複雜度。

  • 當使用 Uniformity 方式,須注意 Leaf 對於 Add, Remove 等相關操作不應實作(違反依賴反轉)。


Reference