組合模式
組合(Composite)模式:允許你將對象組合成樹形結(jié)構(gòu)來表現(xiàn)“整體/部分”層次結(jié)構(gòu)。組合能讓客戶以一致的方式處理個別對象以及對象組合茄茁。
組合模式比較復雜一些麻敌,跟迭代器模式配合威力強大圆裕。
樹形結(jié)構(gòu):
帶子元素的元素稱為 『節(jié)點』(node)
沒有子元素的元素稱為 『葉節(jié)點』(leaf)
包含其他組件的組件為『組合對象』取逾,沒有包含其他組件的組件為『葉節(jié)點對象』
任何一個『節(jié)點』和『葉節(jié)點』都是一種『組合』。
注意點
組合模式讓我們能用樹型方式創(chuàng)建對象的結(jié)構(gòu)箕母,樹里面包含了組合以及個別的對象储藐。
使用組合結(jié)構(gòu),我們能把相同的操作應用在組合和個別對象上嘶是。換句話說邑茄,在大多數(shù)情況下,我們可以忽略對象組合和個別對象之間的差別俊啼。
使用組合模式的時候,Component需要包含Leaf
和Composite
左医,以致于它們都會包含一些自己不需要的方法授帕,所以可能在不需要的方法里throw UnsupportedOperationExecption
或者 返回null
orfalse
同木。
并且這么做,其實是不符合單一職責原則的跛十,但是這么做能換來『透明性』(transparency): 通過讓組件的接口同時包含一些管理子節(jié)點和頁節(jié)點的操作彤路,客戶就可以將組合和葉節(jié)點一視同仁。也就是說芥映,一個元素究竟是組合還是葉節(jié)點洲尊,對客戶是透明的。
要點
- 組合模式提供一個結(jié)構(gòu)奈偏,可同時包含個別對象和組合對象坞嘀。
- 組合模式允許客戶對個別對象以及組合對象一視同仁。
- 組合結(jié)構(gòu)內(nèi)的任意對象成為組件惊来,組件可以是組合丽涩,也可以是葉節(jié)點。
- 實現(xiàn)組合模式時裁蚁,有許多設計上的折中矢渊。你要根據(jù)需要平衡透明性和安全性。
小結(jié)
組合最大的優(yōu)勢是:讓客戶端更加簡單枉证,客戶端不需要再操心面對的是組合對象還是葉節(jié)點對象矮男,所以不需要寫一大堆if語句來保證他們對正確的對象調(diào)用了正確的方法。通常室谚,他們只需要對整個結(jié)構(gòu)調(diào)用一個方法并執(zhí)行操作就可以了毡鉴。