模式定義
組合(Composite Pattern)模式的定義:有時又叫作部分-整體模式,它是一種將對象組合成樹狀的層次結(jié)構(gòu)的模式,用來表示“部分-整體”的關(guān)系,使用戶對單個對象和組合對象具有一致的訪問性,這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式。
模式解決的問題
將對象組合成樹形結(jié)構(gòu)以表示''部分-整體''的層次結(jié)構(gòu)。組合模式使得用戶對單個對象和組合對象的使用具有一致性。
模式角色
抽象構(gòu)件(Component)角色:它的主要作用是為樹葉構(gòu)件和樹枝構(gòu)件聲明公共接口,并實現(xiàn)它們的默認(rèn)行為。在透明式的組合模式中抽象構(gòu)件還聲明訪問和管理子類的接口;在安全式的組合模式中不聲明訪問和管理子類的接口,管理工作由樹枝構(gòu)件完成。
樹葉構(gòu)件(Leaf)角色:是組合中的葉節(jié)點(diǎn)對象,它沒有子節(jié)點(diǎn),用于實現(xiàn)抽象構(gòu)件角色中 聲明的公共接口。
樹枝構(gòu)件(Composite)角色:是組合中的分支節(jié)點(diǎn)對象,它有子節(jié)點(diǎn)。它實現(xiàn)了抽象構(gòu)件角色中聲明的接口,它的主要作用是存儲和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。
代碼實現(xiàn)
運(yùn)行結(jié)果:
優(yōu)缺點(diǎn)分析
優(yōu)點(diǎn):
組合模式使得客戶端代碼可以一致地處理單個對象和組合對象,無須關(guān)心自己處理的是單個對象,還是組合對象,這簡化了客戶端代碼;
更容易在組合體內(nèi)加入新的對象,客戶端不會因為加入了新的對象而更改源代碼,滿足“開閉原則”;
缺點(diǎn):
設(shè)計較復(fù)雜,客戶端需要花更多時間理清類之間的層次關(guān)系;
不容易限制容器中的構(gòu)件;
不容易用繼承的方法來增加構(gòu)件的新功能;
生活中模式情景再現(xiàn)
在現(xiàn)實生活中,存在很多“部分-整體”的關(guān)系。汽車與輪胎、發(fā)動機(jī)的關(guān)系。醫(yī)院與科室、醫(yī)生的關(guān)系。學(xué)校與學(xué)院、學(xué)生、老師的關(guān)系。
模式的啟發(fā)
組合模式是一種非常普遍和常用的模式,接口服務(wù)互相組合,提供更豐富的接口,實現(xiàn)復(fù)雜的業(yè)務(wù)邏輯。一般情況會選擇使用組合代替繼承,組合更靈活、更方便。電影中的cp組合,也是制造看點(diǎn),讓雙方的粉絲為其買單。
推薦閱讀:
java設(shè)計模式之訪問者模式,“見人說人話,見鬼說鬼話”
java設(shè)計模式之原型模式,本故事純屬虛構(gòu),如有雷同,純屬巧合
java設(shè)計模式之橋接模式,策略模式旗艦版,世界沒有免費(fèi)的午餐
java設(shè)計模式之構(gòu)建模式,私人訂制自己的創(chuàng)意
java設(shè)計模式之狀態(tài)模式,策略模式的孿生兄弟
java設(shè)計模式之迭代器模式,顧客永遠(yuǎn)的上帝
Head First 設(shè)計模式之命令模式,各司其職提高效率
Head First 設(shè)計模式之裝飾器模式,因為參與,所以認(rèn)同
Head First 設(shè)計模式之單例模式,每個人都是唯一
Head First 設(shè)計模式之觀察者模式,你我都是發(fā)布者和訂閱者
Head first 設(shè)計模式之策略模式,來源于生活,用之于生活
更多文章:
15年經(jīng)驗的老兵推薦書單,高手是這樣煉成的,你讀了幾本?
應(yīng)用監(jiān)控系列之誰開發(fā)誰運(yùn)行誰監(jiān)控