首頁 > Java > java教程 > 主體

設計模式專題組合模式講解

巴扎黑
發布: 2017-07-18 18:17:09
原創
1088 人瀏覽過

定義(百度百科):
將物件組合成樹狀結構以表示「部分整體」的層次結構。組合模式使得使用者對單一物件和組合物件的使用具有一致性。

 

UML類別圖:

 

 

特定程式碼:

public class Client {public static void main(String[] args) throws UnmarshalException {
        Component root = new Composite();

        Component c1 = new Composite();
        Component c2 = new Composite();

        Component leaf1 = new Leaf();
        Component leaf2 = new Leaf();
        Component leaf3 = new Leaf();

        root.add(c1);
        root.add(c2);
        root.add(leaf1);
        root.add(leaf2);
        root.add(leaf3);

        Component o = root.get(0);
        o.operation();
        Component o1 = root.get(1);
        o1.operation();
        Component o2 = root.get(2);
        o2.operation();
    }
}public abstract class Component {abstract void operation();void add(Component c) throws UnmarshalException {         throw new UnmarshalException("不支持");
    }void remove(Component c) throws UnmarshalException {throw new UnmarshalException("不支持");
    }
    Component get(int index) throws UnmarshalException {throw new UnmarshalException("不支持");
    }
}public class Composite extends Component {

    List<Component> list = null;
    @Overridevoid operation() {
        System.out.println("Composite");         if (!CollectionUtil.isEmpty(list)) {             for (Component c : list) {
                c.operation();
             }
         }
    }

    @Overridevoid add(Component c) throws UnmarshalException {if (CollectionUtil.isEmpty(list)) {
            list = new ArrayList<>();
        }
        list.add(c);
    }

    @Overridevoid remove(Component c) throws UnmarshalException {if (!CollectionUtil.isEmpty(list)) {
             list.remove(c);
        }
    }

    @Override
    Component get(int index) throws UnmarshalException {if (!CollectionUtil.isEmpty(list)) {             return list.get(index);
        }return null;
    }
}public class Leaf extends Component {
    @Overridevoid operation() {
        System.out.println("叶子节点操作");
    }
}
登入後複製

 

模組說明:

Component(抽象構件):
Component是組合中的物件宣告抽象類,在適當的情況下,實作所有類別共有介面的預設行為。用於存取和管理Component子部件。
Composite(容器構件):
定義有枝節點行為,用來儲存子元件,在Component介面中實作與子元件有關操作,如增加(add)和刪除(remove)等
Leaf (葉子構件):
Leaf 在組合中表示葉子結點對象,葉子結點沒有子結點

具體例子:

##舉個新聞客戶端的例子,菜單分類,部門機構的分類,公司部門的分類等等。

應用場景:描述樹狀結構,可以統一操作樹的全部節點,增加刪除擷取等等。

優缺點:優點:
包含了基礎物件和組合物件的層次結構
簡化了客戶端的調用,對組合還是子葉不用區分對待。
可以增加子葉,增加了擴展性。

缺點:

安全性和透明性是個不可調和的矛盾。當然此模式實現更多考慮透明性,對子葉還是組件一視同仁,
這樣相對子葉和組合對象分別處理變得十分困難,需要做類型轉換,這顯然影響安全性。
另外當業務越來越複雜,對元件抽像也是很大的挑戰。

總結:統一了子葉和組合物件的操作。

以上是設計模式專題組合模式講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板