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

標簽: 設計模式初涉


描述性文字

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

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

假設這兩類需求如下:

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

菜品:菜名,描述信息,價格,打印信息

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


不使用組合模式寫菜單

1.先把四個菜品都創建出來,一樣的結構,名稱,描述,價格,打?。?/p>

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

3.客戶端調用

4.打印結果

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


使用組合模式寫菜單

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

2.四個照葫蘆畫瓢的菜品類

3.菜單類

4.客戶端調用

5.打印結果

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


概念與總結


三個角色

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

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

UML類圖


使用情景

  • 如果你想表示對象的部分-整體層次結構,可以選用組合模式,
    把整體和部分的操作統一起來,使得層次結構實現更簡單,從外
    部來使用這個層次結構也簡單;
  • 如果你希望統一的使用組合結構中的所有對象,可以選用組合
    模式,這正是組合模式提供的主要功能;

優缺點

優點

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

缺點

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


本節代碼

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


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容

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