1. 程式人生 > >組合模式-Composite Pattern

組合模式-Composite Pattern

意圖:

將物件組合成樹形結構以表示”部分-整體”的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。

主要解決:

它在我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程式可以向處理簡單元素一樣來處理複雜元素,從而使得客戶程式與複雜元素的內部結構解耦。

何時使用:

  1. 您想表示物件的部分-整體層次結構(樹形結構)。
  2. 您希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。

如何解決:

樹枝和葉子實現統一介面,樹枝內部組合該介面。

關鍵程式碼:

樹枝內部組合該介面,並且含有內部屬性 List,裡面放 Component。

應用例項:

  1. 算術表示式包括運算元、操作符和另一個運算元,其中,另一個操作符也可以是操作樹、操作符和另一個運算元。
  2. 在 JAVA AWT 和 SWING 中,對於 Button 和 Checkbox 是樹葉,Container 是樹枝。

優點:

  1. 高層模組呼叫簡單。
  2. 節點自由增加。

缺點:

在使用組合模式時,其葉子和樹枝的宣告都是實現類,而不是介面,違反了依賴倒置原則。

使用場景:

部分、整體場景,如樹形選單,檔案、資料夾的管理。

注意事項:

定義時為具體類。

通用類圖:

組合模式

通用原始碼:

抽象構件

public abstract
class Component { //個體和整體都具有的共享 public void doSomething(){ //編寫業務邏輯 } }

樹枝構件

public class Composite extends Component {
    //構件容器
    private ArrayList<Component> componentArrayList = new ArrayList<Component>();
    //增加一個葉子構件或樹枝構件
    public void add(Component component){
        this
.componentArrayList.add(component); } //刪除一個葉子構件或樹枝構件 public void remove(Component component){ this.componentArrayList.remove(component); } //獲得分支下的所有葉子構件和樹枝構件 public ArrayList<Component> getChildren(){ return this.componentArrayList; } }

樹葉構件

public class Leaf extends Component {
    /*
    * 可以覆寫父類方法
    * public void doSomething(){
    *
    * }
    */
}

場景類

public class Client {
    public static void main(String[] args) {
        //建立一個根節點
        Composite root = new Composite();
        root.doSomething();
        //建立一個樹枝構件
        Composite branch = new Composite();
        //建立一個葉子節點
        Leaf leaf = new Leaf();
        //建立整體
        root.add(branch);
        branch.add(leaf);
    }
    //通過遞迴遍歷樹
    public static void display(Composite root){
        for(Component c:root.getChildren()){
            if(c instanceof Leaf){ //葉子節點
                c.doSomething();
            }else{ //樹枝節點
                display((Composite)c);
            }
        }
    }
}