一、概述
在生活中谒臼,我們通常希望一些統(tǒng)一的操作,例如當(dāng)我用殺毒軟件掃描該文件夾時(shí)耀里,往往不會(huì)關(guān)心里面有多少文件和子文件夾,我們只需要操作最外層的文件夾進(jìn)行掃描拾氓。
來看一幅圖:
這幅圖可以對應(yīng)上例:
1.最頂端組合對象 = 最外層的文件夾
2.葉對象 = 文件夾中的文件
3.子組合對象 = 子文件夾
文件夾與文件可以構(gòu)成上圖中的這種樹形結(jié)構(gòu)冯挎,客戶只需操作最外層的組合對象,忽略內(nèi)部葉對象與子組合對象咙鞍,便可以統(tǒng)一執(zhí)行房官,完成操作。
由此對象組合成樹形結(jié)構(gòu)來表現(xiàn) "整體和部分" 層次結(jié)構(gòu)续滋,并且組合能讓客戶以一致的方式處理個(gè)別對象以及組合對象翰守,就叫做組合模式。
這個(gè)模式的好處是客戶僅需與最頂層一個(gè)對象交互疲酌,便可以完成整個(gè)樹形系統(tǒng)的統(tǒng)一操作蜡峰,而且樹形結(jié)構(gòu)內(nèi)部節(jié)點(diǎn)上隨意刪除或者增加對象,對客戶是沒有影響的朗恳。
優(yōu)點(diǎn):
1湿颅、高層模塊調(diào)用簡單。
2粥诫、節(jié)點(diǎn)自由增加油航。
缺點(diǎn):在使用組合模式時(shí),其葉子和樹枝的聲明都是實(shí)現(xiàn)類怀浆,而不是接口谊囚,違反了依賴倒置原則。
二执赡、運(yùn)用
通過上例镰踏,可知組合模式中幾個(gè)角色:
Component(抽象類):它可以是接口或抽象類,為葉對象和組合對象聲明接口搀玖。
Leaf(葉對象):它在組合結(jié)構(gòu)中表示葉對象余境,葉對象沒有子節(jié)點(diǎn)。
Composite(組合對象):它在組合結(jié)構(gòu)中表示組合對象灌诅,組合對象包含子節(jié)點(diǎn)芳来,其子節(jié)點(diǎn)可以是葉對象,也可以是組合對象猜拾。
還是以掃描該文件夾為例即舌,簡單介紹一下,F(xiàn)older 類是組合對象挎袜,F(xiàn)ile 類是葉對象顽聂,F(xiàn)loder 中 add 方法提供了構(gòu)建樹形結(jié)構(gòu)的基礎(chǔ)方法肥惭;組合對象和葉對象必須都含有 scan 方法,才能做到統(tǒng)一執(zhí)行紊搪。
Component (抽象類)
Composite (組合對象)
Leaf (葉對象)
test:
三蜜葱、應(yīng)用場景
組合模式如果運(yùn)用得當(dāng),可以大大簡化客戶的代碼耀石。一般來說牵囤,組合模式適用于以下這兩種情況。
表示對象的部分-整體層次結(jié)構(gòu)滞伟。組合模式可以方便地構(gòu)造一棵樹來表示對象的部分-整體結(jié)構(gòu)揭鳞。特別是我們在開發(fā)期間不確定這棵樹到底存在多少層次的時(shí)候。在樹的構(gòu)造最終完成之后梆奈,只需要通過請求樹的最頂層對象野崇,便能對整棵樹做統(tǒng)一的操作。在組合模式中增加和刪除樹的節(jié)點(diǎn)非常方便亩钟,并且符合開放-封閉原則乓梨。
客戶希望統(tǒng)一對待樹中的所有對象。組合模式使客戶可以忽略組合對象和葉對象的區(qū)別径荔,客戶在面對這棵樹的時(shí)候督禽,不用關(guān)心當(dāng)前正在處理的對象是組合對象還是葉對象,也就不用寫一堆 if 总处、 else 語句來分別處理它們狈惫。組合對象和葉對象會(huì)各自做自己正確的事情,這是組合模式最重要的能力鹦马。