結構型模式之組合模式
阿新 • • 發佈:2018-12-07
新的 http getch branch oot 調用 block 工業 等級
組合模式也叫合成模式,用來描述部分與整體的關系。
定義:
- 將對象組合成樹形結構以表示“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。
組合模式類圖如下所示。
組合模式提供以下3個角色:
- 抽象構件(Component)角色:定義參加組合對象的共有方法和屬性,規範一些默認的行為接口。
- 葉子結構(Leaf)角色:葉子對象,其下沒有其他的分支,定義出參加組合的原始對象的行為。
- 樹枝構件(Composite)角色:代表參加組合的、其下有分支的樹枝對象,它的作用是將樹枝和葉子組合成一個樹形結構,並定義出管理子對象的方法,如add()、remove()等。
Component.java
// 定義抽象構件接口 public interface Component { public void operation(); }
Composite.java
// 定義樹枝構件 public class Composite implements Component { // 構件容器 private ArrayList<Component> componentList = new ArrayList<Component>(); // 添加構件 public void add(Component component) {this.componentList.add(component); } // 刪除構件 public void remove(Component component) { this.componentList.remove(component); } // 獲取子構件 public ArrayList<Component> getChild() { return this.componentList; } @Override public void operation() { System.out.println("業務邏輯代碼"); } }
Leaf.java
// 定義葉子結構 public class Leaf implements Component { @Override public void operation() { System.out.println("業務邏輯代碼Leaf"); } }
Client.java
public class Client { public static void main(String[] args) { // 創建根節點 Composite root = new Composite(); // 創建樹枝節點 Composite branch = new Composite(); // 創建葉子節點 Leaf leaf = new Leaf(); root.add(branch); branch.add(leaf); display(root); } // 遍歷樹遞歸 public static void display(Composite root) { for (Component c : root.getChild()) { if (c instanceof Leaf) { // 如果節點類型是葉子節點 c.operation(); } else { // 樹枝節點 c.operation(); display((Composite) c); } } } }
優點:
- 高層模塊調用簡單。樹形結構中的所有節點都是Component,局部和整體對調用者來說沒有任何區別,即高層模塊不必關心自己處理的是單個對象還是整個組合結構,簡化了高層模塊的代碼。
- 節點自由增加。使用組合模式後,如果想增加一個樹枝節點,樹葉節點只需要找到其父節點即可,
缺點:
- 不易控制樹枝構件的類型。
- 不易使用新的方法來增加新的行為。
使用場景:
- 需要描述對象的部分和整體的等級結構,如樹形菜單、文件和文件夾管理。
- 需要客戶端忽略個體構件和組合構件的區別,平等對待所有的構件。
摘自:
青島東合信息技術有限公司 . 設計模式(Java版) . 電子工業出版社,2012,86-89.
結構型模式之組合模式