java 開發模式之十一 組合模式

2021-08-13 23:37:27 字數 3787 閱讀 3991

組合模式又叫做部分-整體模式

,它使我們樹型結構的問題中

,模糊了簡單元素和複雜元素的概念

,客戶程式可以向處理簡單元素一樣來處理複雜元素

,從而使得客戶程式與複雜元素的內部結構解藕。

component: 為參加組合的物件宣告乙個公共介面

, 不管是組合還是葉結點

.leaf: 在組合中表示葉子結點物件

,葉子結點沒有子結點.

composite: 表示參加組合的有子物件的物件

, 並給出樹枝購件的行為;

需求變更:某一家店的選單新增餐後甜點子選單

餐廳選單聚類結構現狀:

結構抽象

需要用樹形結構,節點是選單或子選單,葉子是選單項

需要能夠在各個選單項之間遊走,遍歷

要能夠有彈性的在選單項之間遊走

組合模式的設計方案:

類圖:

迭代器元件類:

public class composeiterator implements iterator 

@override

public boolean hasnext()

iterator iterator = stack.peek();

if (!iterator.hasnext()) else

} @override

public object next()

return null;

} @override

public void remove()

}

public class nulliterator implements iterator

@override

public object next()

@override

public void remove()

}

選單元件介面:

public abstract class menucomponent 

public string getdescription()

public float getprice()

public boolean isvegetable()

public abstract void print();

public iterator getiterator()

}

選單項實現類:

public class menuitem extends menucomponent

@override

public string getname()

@override

public string getdescription()

@override

public float getprice()

@override

public boolean isvegetable()

@override

public void print()

}

public class submenu extends menucomponent 

private void additem(string name, string description, boolean vegetable,

float price)

public iterator getiterator()

@override

public void print() ;

// 其他功能**

}

餐廳類:

public class cakehousemenu extends menucomponent 

private void additem(string name, string description, boolean vegetable,

float price)

public iterator getiterator()

@override

public void print() ;

// 其他功能**

}

public class dinermenu extends menucomponent 

private void additem(string name, string description, boolean vegetable,

float price) else

}private void addsubmenu(menucomponent mmenucomponent) else

}public iterator getiterator()

class dineriterator implements iterator

@override

public boolean hasnext()

return false;

}@override

public object next()

@override

public void remove()

}@override

public void print() ;

}

服務員類:

public class waitress 

public void addcomponent(menucomponent mmenucomponent)

public void printmenu()

} }public void printvegetablemenu()

}} }

}

測試類:

public class maintest 

}

這個重點在於迭代器元件類,這個類對選單項和子選單項中的選單項進行了遞迴邏輯處理。

組合模式能讓客戶以一致的方式來處理個別物件以及物件組合。

也就是我們可以忽略物件組合與個體物件之間的差別

1. 表示整體-部分的層次結構。

2.希望使用者忽略組合物件與單個物件的不同,使用者將統一的使用組合結構中的所有物件

主要優點有:

1. 定義了包含基本物件和組合物件的類的層次結構。基本物件可以被組合成更複雜的組合物件,這個組合又會被組合,不斷遞迴下去。

2.簡化客戶**。客戶可以一致的使用組合結構和單個物件。

3.使得更容易增加新增型別的元件。

缺點主要有:

很難限制組合中的元件。有時希望乙個組合只能有某些特定元件。使用composite時,不能依賴型別系統施加這些約束,而必須要在執行時刻進行檢查

Java設計模式(十一) 組合模式

組合模式 一 定義 二 結構 三 具體案例 四 適用性 五 總結 一 定義 將物件組合成樹形結構以表示 部分整體 的層次結構。組合模式使得使用者對單個物件和使用具有一致性。二 結構 類圖 角色 1.component 是組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告乙個介面...

設計模式C 實現(十一) 組合模式

將物件組合成樹形結構以表示 部分 整體 的層次結構。composite使得使用者對單個物件和組合物件的使用具有一致性。我們實現乙個選單結構,乙個選單可以包含子選單或者選單項 定義乙個抽象類,選單和選單項都繼承自這個類 public abstract class menucomponet public...

java設計模式之組合模式

組合模式 允許你將物件組合成樹形結構來表現 整體 部分 層次結構。組合能讓客戶以一致的方式處理個別物件以及物件組合。組合模式類圖 client 客戶使用component介面操作組合中的物件。component component為組合中的所有物件定義乙個介面,不管是組合還是節點,component...