如何讓孩子愛上設(shè)計(jì)模式 ——9.組合模式(Composite Pattern)

標(biāo)簽: 設(shè)計(jì)模式初涉


描述性文字

組合模式,又稱為 部分整體模式,把具有相似的一組對象
當(dāng)做一個(gè)對象處理,用一種樹狀的結(jié)構(gòu)來組合對象,再提供統(tǒng)一
的方法去訪問相似的對象,以此忽略掉對象與對象容器間的差別。

舉個(gè)簡單例子,菜單和菜品,同樣是以小豬的奶茶店為例子:

假設(shè)這兩類需求如下:

菜單:菜單名,描述信息,添加,添加刪除子菜單或菜品
遞歸打印出所有的子菜單與菜品!

菜品:菜名,描述信息,價(jià)格,打印信息

好的,先試試不用組合模式,要怎么寫~


不使用組合模式寫菜單

1.先把四個(gè)菜品都創(chuàng)建出來,一樣的結(jié)構(gòu),名稱,描述,價(jià)格,打印:

2.創(chuàng)建菜單類,名稱,描述信息,可以增刪菜品,子菜單,遍歷打?。?/p>

3.客戶端調(diào)用

4.打印結(jié)果

好的,沒毛病,但是問題來了,如果增刪菜品或者子菜單,原有代碼
都要進(jìn)行相應(yīng)的修改,擴(kuò)展性差,如果引入組合模式會又會如何?


使用組合模式寫菜單

1.抽象出即可代表菜單又可代表菜品的類,這里我們只需要一個(gè)
add,get,getString三個(gè)抽象方法,讓菜單和菜品去繼承,菜品
只需完成getString方法重寫,菜單需要重寫add和get方法。

2.四個(gè)照葫蘆畫瓢的菜品類

3.菜單類

4.客戶端調(diào)用

5.打印結(jié)果

使用了合并模式,如果此時(shí)我們要新增一個(gè)菜品,只需繼承抽象構(gòu)建類,
無需改動其他類,顯得更加方便。


概念與總結(jié)


三個(gè)角色

上面也說了合并模式是用一種樹狀的結(jié)構(gòu)來組合對象,三個(gè)名詞
根節(jié)點(diǎn)枝結(jié)點(diǎn),葉子結(jié)點(diǎn),類比上面那個(gè)菜單的圖,
根節(jié)點(diǎn)是菜單,枝結(jié)點(diǎn)是飲料菜單和小吃菜單,
葉子結(jié)點(diǎn)是奶茶,果汁,手抓餅和魚蛋!

  • Component抽象組件,為組合中的對象聲明接口,讓客戶端
    可以通過這個(gè)接口來訪問和管理整個(gè)對象結(jié)構(gòu),可以在里面為定義的
    功能提供缺省的實(shí)現(xiàn),比如上面的AbstractMenu類。
  • Composite容器組件,繼承抽象組件,實(shí)現(xiàn)抽象組件中與
    葉子組件相關(guān)的操作,比如上面的Menu類重寫了get,set方法。
  • Leaf葉子組件,定義和實(shí)現(xiàn)葉子對象的行為,不再包含其它
    的子節(jié)點(diǎn)對象,比如上面的MilkTea,Juice,HandCake,F(xiàn)ishBall。

UML類圖


使用情景

  • 如果你想表示對象的部分-整體層次結(jié)構(gòu),可以選用組合模式,
    把整體和部分的操作統(tǒng)一起來,使得層次結(jié)構(gòu)實(shí)現(xiàn)更簡單,從外
    部來使用這個(gè)層次結(jié)構(gòu)也簡單;
  • 如果你希望統(tǒng)一的使用組合結(jié)構(gòu)中的所有對象,可以選用組合
    模式,這正是組合模式提供的主要功能;

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

讓客戶端更加簡單,客戶端不需要再操心面對的是組合對象還是葉節(jié)點(diǎn)
對象,所以不需要寫一大堆if語句來保證他們對正確的對象調(diào)用了正確
的方法。通常,他們只需要對整個(gè)結(jié)構(gòu)調(diào)用一個(gè)方法并執(zhí)行操作就可以了。

缺點(diǎn)

容易增加新的組件也會帶來一些問題,比如很難限制組合中的組件類型。
這在需要檢測組件類型的時(shí)候,使得我們不能依靠編譯期的類型約束來
完成,必須在運(yùn)行期間動態(tài)檢測。


本節(jié)代碼

https://github.com/coder-pig/DesignPatternsExample/tree/master/8.Composite%20Pattern


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 商品類別樹## 考慮這樣一個(gè)實(shí)際的應(yīng)用:管理商品類別樹。 在實(shí)現(xiàn)跟商品有關(guān)的應(yīng)用系統(tǒng)的時(shí)候...
    七寸知架構(gòu)閱讀 6,073評論 10 59
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,335評論 25 708
  • 場景分析 我們平時(shí)去餐廳吃飯,都會使用菜單來點(diǎn)餐,今天我們來實(shí)現(xiàn)一個(gè)超級菜單,這個(gè)一個(gè)菜單大集合,包括單一菜品和子...
    西木柚子閱讀 753評論 0 3
  • 人活著的時(shí)候總有一瞬間會覺得自己已經(jīng)死去 可是死去的人或許不會知道自己是否活著 生死并存模糊不清 人們說真正的死亡...
    杋南閱讀 248評論 0 0
  • 無論主角還是配角我們都承擔(dān)好自己的角色的責(zé)任 我文筆不好,寫不出來那種辭藻華麗地文字,我只能去真實(shí)的描述我的生活以...
    愿時(shí)光伴我成長閱讀 417評論 0 0