繼上一集倆餐廳合併了選單之後,現在我們有想在午餐的選單中加乙份子選單——甜點。
// 抽象類 實現選單元件
public abstract class menucomponent
public void remove(menucomponent menucomponent)
// 同理其它方法,getchild(int i) getname() getdescription() getprice() isvegetarian() print()
// 這樣寫是因為有的方法只對選單項有意義,而有的只對選單有意義,不支援的操作預設實現異常即可。
}
// 實現選單項
public class menuitem extends menucomponent
// 省略一堆get set函式
public void print()
}
// 定義組合選單
public class menu extends menucomponent
public void remove(menucomponent menucomponent)
public menucomponent getchild(int i)
public void print()
}}
public class waitress
public void printmenu()
}
組合模式不但要管理層次結構,還要執行選單的操作,所以組合模式是以單一責任設計原則換取透明性。透明性是指通過讓元件的介面同時包含一些管理子節點和葉子節點的操作,客戶可以將組合和也節點一視同仁。
menucomponent類同時具有兩種型別的操作,因為客戶有機會對乙個元素做一些不恰當的操作(如試圖把選單新增到選單項中),所以我們會失去一些安全性,這是設計上抉擇。我們可以把責任區分開來放入不同的介面,這樣設計安全,但是也失去了透明性,客戶必須判斷以處理不同型別的節點。
所以這是乙個很典型的折衷案例。
我們在處理的時候,可以採用空迭代器(一直返回false)來代替返回null。
組合模式:允許你將物件組合成樹形結構來表現「整體/部分」層次結構,組合能讓客戶一一致的方式處理個別物件以及物件組合。
組合模式讓我們能用樹形方式建立物件的結構,樹裡面包含了組合以及個別的物件。
使用組合結構,我們能把相同的操作應用到組合和個別物件上。換句話說,在大多數情況下,我們可以忽略物件組合和個別物件之間的差別。
組合模式讓客戶生活的更加簡單,讓他們不需要操心面對的是組合物件還是葉節點物件。
在實現組合模式時,有許多折衷的設計,需要平衡透明性和安全性。
組合模式 設計模式 組合模式
1.需求分析 假設要給乙個大公司做辦公管理系統,公司有人力資源部 財務部等,然後公司在其他城市還有分公司,分公司也有自己的人力資源部 財務部等,要求總公司 分公司以及各部分成樹狀結構管理。要完成這麼乙個系統,為了有乙個更好的設計,方便開發的展開,就需要了解乙個設計模式 組合模式。2.定義 將物件組合...
設計模式 組合模式 組合模式使用
目錄 組合模式概括 組合模式使用場景 定義 將物件組合成樹形結構以表示 部分 整體 的層次結構 作用 使客戶端對單個物件和組合物件保持一致的處理方式 使用場景 1.希望客戶端可以忽略組合物件與單個物件的差異時 2.處理乙個樹形結構時 優點 清楚的定義分層次的複雜物件,表示物件的全部或部分層次 讓客戶...
設計模式 組合設計模式
組合模式 composite pattern 又稱部分整體模式,用於把一組相似的物件當做乙個單一的物件,組合模式依據樹形來組合物件,用來表示部分以及整體層次,為結構型設計模式,它建立來物件組的樹形結構。意圖 將物件組合成樹形結構以表示 部分 整體 的結構層次,組合模式使得使用者對單個物件和組合物件的...