組合模式的設(shè)計動機(jī):組合模式定義了如何將容器對象和葉子對象進(jìn)行遞歸組合肠虽,使得客戶在使用的過程中無須進(jìn)行區(qū)分旁舰,可以對他們進(jìn)行一致的處理蜡饵。
定義:組合模式組合多個對象形成樹形結(jié)構(gòu)以表示“整體-部分”的結(jié)構(gòu)層次烂瘫。
在使用組合模式中需要注意一點(diǎn)也是組合模式最關(guān)鍵的地方:葉子對象和組合對象實(shí)現(xiàn)相同的接口。這就是組合模式能夠?qū)⑷~子節(jié)點(diǎn)和對象節(jié)點(diǎn)進(jìn)行一致處理的原因帽哑。
類圖:
組合模式主要包含如下幾個角色:
1.Component :組合中的對象聲明接口谜酒,在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的默認(rèn)行為妻枕。聲明一個接口用于訪問和管理Component子部件僻族。
2.Leaf:葉子對象。葉子結(jié)點(diǎn)沒有子結(jié)點(diǎn)屡谐。
3.Composite:容器對象述么,定義有枝節(jié)點(diǎn)行為,用來存儲子部件愕掏,在Component接口中實(shí)現(xiàn)與子部件有關(guān)操作度秘,如增加(add)和刪除(remove)等。
從模式結(jié)構(gòu)中我們看出了葉子節(jié)點(diǎn)和容器對象都實(shí)現(xiàn)Component接口饵撑,這也是能夠?qū)⑷~子對象和容器對象一致對待的關(guān)鍵所在剑梳。
模式實(shí)現(xiàn):
在文件系統(tǒng)中唆貌,可能存在很多種格式的文件,如果圖片垢乙,文本文件锨咙、視頻文件等等,這些不同的格式文件的瀏覽方式都不同追逮,同時對文件夾的瀏覽就是對文件夾中文件的瀏覽酪刀,但是對于客戶而言都是瀏覽文件,兩者之間不存在什么差別钮孵,現(xiàn)在只用組合模式來模擬瀏覽文件骂倘。
模式優(yōu)點(diǎn):
1,清楚地定義分層次的復(fù)雜對象巴席,表示對象的全部或部分層次稠茂,使得增加新構(gòu)件也更容易。
2情妖,調(diào)用簡單,客戶端可以一致的使用組合結(jié)構(gòu)或其中單個對象诱担。
3毡证,定義了包含葉子對象和容器對象的類層次結(jié)構(gòu),葉子對象可以被組合成更復(fù)雜的容器對象蔫仙,而這個容器對象又可以被組合料睛,這樣不斷遞歸下去,可以形成復(fù)雜的樹形結(jié)構(gòu)摇邦。
4恤煞,容易在組合體內(nèi)加入對象構(gòu)件,客戶端不必因?yàn)榧尤肓诵碌膶ο髽?gòu)件而更改原有代碼
模式缺點(diǎn):
使設(shè)計變得更加抽象施籍,對象的業(yè)務(wù)規(guī)則如果很復(fù)雜居扒,則實(shí)現(xiàn)組合模式具有很大挑戰(zhàn)性,而且不是所有的方法都與葉子對象子類都有關(guān)聯(lián)丑慎。
適用場景:
1.需要表示一個對象整體或部分層次喜喂,在具有整體和部分的層次結(jié)構(gòu)中,希望通過一種方式忽略整體與部分的差異竿裂,可以一致地對待它們玉吁。
2.讓客戶能夠忽略不同對象層次的變化,客戶端可以針對抽象構(gòu)件編程腻异,無須關(guān)心對象層次結(jié)構(gòu)的細(xì)節(jié)进副。
總結(jié):
1,模式用于將多個對象組合成樹形結(jié)構(gòu)以表示“整體-部分”的結(jié)構(gòu)層次悔常。組合模式對單個對象(葉子對象)和組合對象(容器對象)的使用具有一致性影斑。
2给赞,組合對象的關(guān)鍵在于它定義了一個抽象構(gòu)建類,它既可表示葉子對象鸥昏,也可表示容器對象塞俱,客戶僅僅需要針對這個抽象構(gòu)建進(jìn)行編程,無須知道他是葉子對象還是容器對象吏垮,都是一致對待障涯。
3,組合模式雖然能夠非常好地處理層次結(jié)構(gòu)膳汪,也使得客戶端程序變得簡單唯蝶,但是它也使得設(shè)計變得更加抽象,而且也很難對容器中的構(gòu)件類型進(jìn)行限制遗嗽,這會導(dǎo)致在增加新的構(gòu)件時會產(chǎn)生一些問題粘我。