引子
假設乙個學校有多個學院,乙個學院有多個系,傳統的方法可以使用繼承的方式實現。但是這樣做是有問題的,傳統方式是把學院作為學校的子類,系作為學院的子類,如果學校要增加或減少學院的話,相應的類會增加或減少,這樣的改動是比較大的,所以這樣的整體與部分的關係不適合使用傳統的繼承,可以使用組合模式。
組合模式
組合模式是建立物件組的樹形結構,將物件組合成樹狀結構以表示「整體-部分」的層次關係。
組合模式依據樹形結構來組合物件,用來表示部分以及整體層次
組合模式屬於結構型模式
組合模式使得使用者對單個物件和組合物件的訪問具有一致性,即:組合能讓客戶以一致的方式處理個別物件以及組合物件。
下面以uml圖的形式來描述
compent:這是組合模式中物件宣告介面,在適當情況下,實現所有類共有的介面預設行為,用於訪問和管理compent子部件,compent可以是抽象類或者介面
leaf:在組合中表示葉子節點,葉子節點是沒有子節點
在引子中說的乙個學校有多個學院,乙個學院有多個系,就可以使用組合模式,如下圖所用
學校、學院和系共同繼承乙個組織類,包括學校、學院及系的公共方法,相當於組合模式的compent。學校下面包含學院可進行新增或刪除,學院下面包含系可進行新增或刪除,因為學校和學院下面都有子節點,所以學校和學院相當於composite,系下面是沒有子節點的,所以系相當於leaf。這就和多型差不多(個人理解),也符合開閉原則。
組合模式使用注意事項
簡化客戶端操作。客戶端只需要面對一致的物件而不用考慮整體或部分的問題
可擴充套件性好。當要更改組合物件時,只需要調整內部的層次關係,客戶端不用做出任何操作
需要遍歷組織結構或者處理的物件具有樹形結構時,非常適合使用組合模式
要求較高的抽象性,如果節點和葉子有很多的差異性,如方法和屬性都不一樣,不適合使用組合模式
點晴可以看jdk中的hashmap來進一步了解組合模式。
設計模式之組合模式
組合模式 以 整體 部分 的層次結構,將物件以樹型結構組合起來。如下圖所示 組合模式首先得定義乙個用來管理和訪問部件們的抽象類。public abstract class equipment 再建立乙個組合體的部件 class element equipment 現在我們再來定義乙個組合體,也就是組...
設計模式之 組合模式
有時候我們需要維護一些物件,這些物件具有一定的層次結構,它們之間雖然差異很大,但在使用的時候我們希望能構一致的對待,比如windows控制項,繪圖中的圖形等,這個時候我們就可以採用組合模式來進行管理。組合模式就是將要管理的物件按樹型結構來進行組織,表示成一種 整體 部分 的層次結構,使得使用者對單個...
設計模式之組合模式
組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構。使得使用者對單個物件和組合物件的使用具有一致性。適用性 想表示物件的部分 整體層次結構,希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。典型表示結構圖 宣告組合中的物件宣告介面 在適當的情況下,實現所有類共...