我們在開發過程中經常使用到樹形結構,它分爲葉子節點和和分支節點兩種,客戶對象在使用這兩種對象時候經常要對它們加以區別,增加了代碼的複雜度,也非常容易出錯。組合模式爲這兩種類型提供了統一的接口,可以讓我們像操作葉子節點那樣方便地操作分支節點。
關於組合模式,GoF 給出的定義是:
Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
將對象組合成樹形結構來表現部分-整體的層次關係。組合使得客戶一致地使用單個對象和組合對象。
要使客戶程序對分支節點和葉子節點進行一樣的操作,那麼它們外形必須一樣,即得有相同的接口隱藏具體實現,下面我們先從 UML 靜態類圖入手。
======================================================================================================================================
安全的組合模式
======================================================================================================================================
透明的組合模式
======================================================================================================================================
安全的組合模式VS透明的組合模式
安全的組合模式編譯時就可以發現爲葉子節點執行add等無意義的管理子節點的操作,但造成了Leaf和 Composite接口不一致,損失了透明性。透明的組合模式只有在運行時纔可能(如果不忽略的這些無意義調用的話)暴露錯誤地使用葉子節點的操作,犧牲了安全性,具有良好的透明性。這二者各有優缺點,讀者在實際編程中需要自己權衡來決定應該使用哪種方式。
======================================================================================================================================
android中的例子
--------------以上摘自《漫談設計式》+ http://www.cnblogs.com/qianxudetianxia/archive/2011/07/29/2121488.html
總結:
當我們需要處理的對象本身包含與自身屬性相同的子對象時,我們就應該使用組合模式。如一個View 可以包含其他子View ,一個公司可以包含分公司,一個數組可以包含子數組,像這種類型的對象,形成了樹形結構,我們定義統一的接口就可以方便地操作對象及對象組合。