1. 程式人生 > 其它 >享元模式(學習筆記12)

享元模式(學習筆記12)

原文:http://c.biancheng.net/view/1373.html

什麼時候用:

  1. 在需要表示一個物件整體與部分的層次結構的場合。
  2. 要求對使用者隱藏組合物件與單個物件的不同,使用者可以用統一的介面使用組合結構中的所有物件的場合

主要優點:

  1. 組合模式使得客戶端程式碼可以一致地處理單個物件和組合物件,無須關心自己處理的是單個物件,還是組合物件,這簡化了客戶端程式碼;
  2. 更容易在組合體內加入新的物件,客戶端不會因為加入了新的物件而更改原始碼,滿足“開閉原則”;
主要缺點:
  1. 設計較複雜,客戶端需要花更多時間理清類之間的層次關係;
  2. 不容易限制容器中的構件;
  3. 不容易用繼承的方法來增加構件的新功能

主要角色:

  1. 抽象構件(Component)角色:它的主要作用是為樹葉構件和樹枝構件宣告公共介面,並實現它們的預設行為。在透明式的組合模式中抽象構件還宣告訪問和管理子類的介面;在安全式的組合模式中不宣告訪問和管理子類的介面,管理工作由樹枝構件完成。(總的抽象類或介面,定義一些通用的方法,比如新增、刪除)
  2. 樹葉構件(Leaf)角色:是組合中的葉節點物件,它沒有子節點,用於繼承或實現抽象構件。
  3. 樹枝構件(Composite)角色 / 中間構件:是組合中的分支節點物件,它有子節點,用於繼承和實現抽象構件。它的主要作用是儲存和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

結構圖:

示例程式碼:

public class CompositePattern {
    public static void main(String[] args) {
        Component c0 = new Composite();
        Component c1 = new Composite();
        Component leaf1 = new Leaf("1");
        Component leaf2 = new Leaf("2");
        Component leaf3 = new Leaf("3");
        c0.add(leaf1);
        c0.add(c1);
        c1.add(leaf2);
        c1.add(leaf3);
        c0.operation();
    }
}

//抽象構件 interface Component { public void add(Component c); public void remove(Component c); public Component getChild(int i); public void operation(); } //樹葉構件 class Leaf implements Component { private String name; public Leaf(String name) { this.name = name; } public void add(Component c) { } public void remove(Component c) { } public Component getChild(int i) { return null; } public void operation() { System.out.println("樹葉" + name + ":被訪問!"); } } //樹枝構件 class Composite implements Component { private ArrayList<Component> children = new ArrayList<Component>(); public void add(Component c) { children.add(c); } public void remove(Component c) { children.remove(c); } public Component getChild(int i) { return children.get(i); } public void operation() { for (Object obj : children) { ((Component) obj).operation(); } } }