外網(wǎng)怎么進(jìn)入排名優(yōu)化軟件
目錄
- 二十三、設(shè)計(jì)模式之組合模式
- 能幫我們干什么?
- 主要解決什么問(wèn)題?
- 優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)
- 缺點(diǎn):
- 使用的場(chǎng)景
- 理解
- 實(shí)現(xiàn)
- 角色
- 組合模式
- 總結(jié)

魔戰(zhàn)已經(jīng)完結(jié)。成功登頂。占領(lǐng)敵軍最高峰。
二十三、設(shè)計(jì)模式之組合模式
“組合模式”也被稱為“部分整體模式”該模式屬于結(jié)構(gòu)型模式的一種。
將對(duì)象組合成樹形結(jié)構(gòu)以表示"部分-整體"的層次結(jié)構(gòu)。組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。
所屬類型 | 定義 |
---|---|
結(jié)構(gòu)型 | 將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分整體”的層次結(jié)構(gòu)。組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。 |
能幫我們干什么?
主要解決什么問(wèn)題?
主要解決的是 它在我們樹型結(jié)構(gòu)的問(wèn)題中,模糊了簡(jiǎn)單元素和復(fù)雜元素的概念,客戶程序可以像處理簡(jiǎn)單元素一樣來(lái)處理復(fù)雜元素,從而使得客戶程序與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
1、高層模塊調(diào)用簡(jiǎn)單。
2、節(jié)點(diǎn)自由增加。
缺點(diǎn):
在使用組合模式時(shí),其葉子和樹枝的聲明都是實(shí)現(xiàn)類,而不是接口,違反了依賴倒置原則。
使用的場(chǎng)景
以下情況下適用Composite模式:
1.你想表示對(duì)象的部分-整體層次結(jié)構(gòu)
2.你希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。
部分、整體場(chǎng)景,如樹形菜單,文件、文件夾的管理。
理解
講解該模式之前先帶大家熟悉一下“樹形結(jié)構(gòu)”。相信大家對(duì)“樹形結(jié)構(gòu)”不會(huì)太陌生,如果你剛好不太了解的話可以想一下大樹,一顆樹它分別有樹根、樹枝、樹葉,正好樹形結(jié)構(gòu)中也有根節(jié)點(diǎn)、子節(jié)點(diǎn)(非葉子節(jié)點(diǎn))、葉子節(jié)點(diǎn)。
組合模式就運(yùn)用了樹形結(jié)構(gòu),該模式的核心思想是:將多個(gè)對(duì)象組合成樹形結(jié)構(gòu),以此結(jié)構(gòu)來(lái)表示“整體-部分”之間的層次關(guān)系。
實(shí)現(xiàn)
角色
- Component:組合模式中的“根節(jié)點(diǎn)”,可以是接口、抽象類、普通類,該類中定義了其子類的所有共性內(nèi)容,并且該類中還存在著用于訪問(wèn)和管理它子部件的方法。
- Leaf:組合中的葉子節(jié)點(diǎn),也就是最末端的節(jié)點(diǎn),該節(jié)點(diǎn)下不會(huì)再有子節(jié)點(diǎn)。
- Composite:非葉子節(jié)點(diǎn),它的作用是存儲(chǔ)子部件,并且在Composite中實(shí)現(xiàn)了對(duì)子部件的相關(guān)操作。
組合模式
如何解決:樹枝和葉子實(shí)現(xiàn)統(tǒng)一接口,樹枝內(nèi)部組合該接口。
關(guān)鍵代碼:樹枝內(nèi)部組合該接口,并且含有內(nèi)部屬性 List,里面放 Component。
實(shí)現(xiàn)難度: ?? ?? ?? ??
舉例:
java/com/kongxiang/raindrop/dp/type/structure/composite · master · 無(wú)難事者若執(zhí) / 23種設(shè)計(jì)模式 · GitCode
葉節(jié)點(diǎn)和組合節(jié)點(diǎn)。
component
public abstract class Component {protected String name;public Component(String name){this.name = name;}public abstract void draw();public abstract void add(Component component);public abstract void remove(Component component);}
leaf
public class Leaf extends Component {public Leaf(String name) {super(name);}@Overridepublic void draw() {System.out.println(this.name);}@Overridepublic void add(Component component) {throw new IllegalArgumentException("葉節(jié)點(diǎn)不能添加組件");}@Overridepublic void remove(Component component) {throw new IllegalArgumentException("葉節(jié)點(diǎn)不能移除組件");}
}
composite
public class Composite extends Component {private List<Component> componentList = new ArrayList<>();public Composite(String name) {super(name);}@Overridepublic void draw() {for (Component com :componentList) {com.draw();}}@Overridepublic void add(Component component) {this.componentList.add(component);}@Overridepublic void remove(Component component) {this.componentList.remove(component);}
}
client
public static void main(String[] args) {Leaf leaf = new Leaf("張三”");Leaf leaf1 = new Leaf("張4”");Leaf leaf2 = new Leaf("張5”");Leaf leaf3 = new Leaf("張6”");Leaf leaf4 = new Leaf("張7”");Composite composite = new Composite("組1");composite.add(leaf);composite.add(leaf1);Composite composite2 = new Composite("組2");composite2.add(leaf2);composite2.add(leaf3);Composite composite3 = new Composite("組3");composite3.add(leaf4);composite.add(composite2);composite2.add(composite3);composite.draw();}
總結(jié)
組合模式解耦了客戶程序與復(fù)雜元素內(nèi)部結(jié)構(gòu),從而使客戶程序可以像處理簡(jiǎn)單元素一樣來(lái)處理復(fù)雜元素。
如果你想要?jiǎng)?chuàng)建層次結(jié)構(gòu),并可以在其中以相同的方式對(duì)待所有元素,那么組合模式就是最理想的選擇。本章使用了一個(gè)文件系統(tǒng)的例子來(lái)舉例說(shuō)明了組合模式的用途。在這個(gè)例子中,文件和目錄都執(zhí)行相同的接口,這是組合模式的關(guān)鍵。通過(guò)執(zhí)行相同的接口,你就可以用相同的方式對(duì)待文件和目錄,從而實(shí)現(xiàn)將文件或者目錄儲(chǔ)存為目錄的子級(jí)元素。