定義(百度百科):
將物件組合成樹狀結構以表示「部分整體」的層次結構。組合模式使得使用者對單一物件和組合物件的使用具有一致性。
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中文網其他相關文章!