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

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