Composite(組合)–對象結構型模式
一、意圖
将對象組合成樹形結構以表示“部分-整體”的層次結構。Composite使得使用者對單個對象群組合對象的使用具有一緻性。
二、動機
1.軟體在某些情況下,客戶代碼過多的依賴于對象容器複雜的内部實作結構,對象容器内部實作結構(而非抽象接口)的變化将引起客戶代碼的頻繁變化,帶來了代碼的維護性、擴充性等弊端。
2.如何将“客戶代碼與複雜代碼的對象容器結構”解耦?讓對象容器自己來實作自身的複雜結構,進而使得客戶代碼就像處理簡單對象一樣來處理複雜的對象容器?
三、适用性
1.你想表示對象的部分-整體層次結構。
2.你希望使用者忽略組合對象與耽擱對象的不同,使用者将統一地使用組合結構中所有對象。
四、結構
五、效果
1.定義了保護潔白對象群組合對象的類層次結構。
2.簡化客戶代碼。
2.是的更容易增加新類型的元件。
4.使你的設計變得更加一般化。
六、實作
1.顯示的父部件引用。
2.共享元件。
3.最大化Component接口。
4.聲明管理子部件的操作。
5.Component是否應該實作一個Component清單。
6.子部件排序。
7.使用高速緩沖存貯改善性能。
8. 應該由誰删除Component
9. 存貯元件最好用哪一個資料結構。
七、要點總結
1.Composite模式采用樹形結構來實作普遍存在的對象容器,進而将“一對多”的關系轉化為“一對一”的關系,使得客戶代碼可以一緻地(複用)處理對象和對象容器,無需關系處理的是單個對象,還是組合的對象容器。
2.将“客戶代碼與複雜的對象容器結構”解耦是Composite的核心思想,解耦之後,客戶代碼将與純粹的抽象接口——而非對象容器的内部實作結構——發生依賴,進而更能“應對變化”。
3.Composite模式在具體實作中,可以讓父對象的子對反向追溯;如果父對象有頻繁的周遊需求,可以使用緩存技巧來改善效率。
八、相關模式
通常部件-父部件連接配接用于Responsibility of Chain模式
Decorator模式經常與Composite模式一起使用。當裝飾群組合一起使用時,它們通常有一個公共的父類。是以裝飾必須支援Add、Remove和GetChild操作的Component接口。
Flyweight讓你共享元件,但不再能引用它們的父部件。
Itertor可用來周遊Composite。
Visitor将本來應該分布子啊Composite和Leaf類中的操作和行為局部化。
九、舉例說明
Composite模式就像一顆樹。
本文為李建忠設計模式視訊的筆記以及《設計模式-可複用面向對象的軟體的基礎》和自己的部分見解