組合模式又叫做部分-整體模式
,它使我們樹型結構的問題中
,模糊了簡單元素和複雜元素的概念
,客戶程式可以向處理簡單元素一樣來處理複雜元素
,從而使得客戶程式與複雜元素的內部結構解藕。
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...