組合(composite)模式,但從名字上就能知道這一模式屬於之前我說過的結構型模式。
在說清組合模式的概念前,得先了解一下資料結構中「樹」這個概念。
樹(tree)是n(n>=0)個結點的有限集合t,t為空時稱為空樹,其它情況叔這個概念要滿足如下兩個條件:
1、有且僅有乙個特定的稱為根(root)的結點;
2、其餘的結點可分為m(m>=0)個互不相交的子集t1/t2....,其中每個子集本身又是一棵樹,並稱其為根的子樹(subtree)。
上面給出的遞迴定義刻畫了樹的特性:一顆非空樹是由若干課子樹(也稱為分支和葉子)。
組合模式其實就是一種樹形**設計模式。
定義:將物件以樹形結構組織起來、以達成「部分-整體」的層次結構,使得客戶端對單個物件和組合物件的使用具有一致性。
定義有點不好理解,組合模式解決的問題是這樣乙個情形,在對物件(此物件有「部分-整體」的層次結構特徵)使用時,能忽略物件組合和單個的不同,統一地使用結構中的所有物件。
下面來看看組合模式的類圖以加深理解:
組合模式由三個角色組成,
1、抽象構件角色(component):它為組合中的物件宣告介面,也可以為共有介面實現預設行為;
2、樹葉構件角色(leaf):在組合中表示葉節點物件--沒有子節點,實現抽象構件角色宣告的介面;
3、樹枝構件角色(composite):在模式中表示分支結點物件--有子節點,實現抽象構件角色宣告的介面:儲存子部件。
由類圖可以看出,不管你使用的是leaf類還是composite類,對於客戶程式來說都是一樣的--客戶僅僅知道component這個抽象類的引用,這使得composite中可以包含任何component抽象類的子類。就像下圖表示的那樣:
子類管理
組合模式的好處在對樹枝結點物件的操作可以遍歷到所有的葉結點,那麼如何完成對葉結點的新增刪除等等操作呢?所以組合模式必須提供對子物件的管理方法。管理方法包含了增加和刪除兩個必需方法。但是管理方法寫到什麼地方去呢?
一種方式是在component角色裡面宣告所有的用來管理子類物件的方法,以達到component介面的最大化,如下圖所示,好處是客戶看起來介面層次上樹葉和分支沒有區別,保證了透明性。但是樹葉是不存在子類的,因此這些管理方法對於葉子來說是多餘的。
另一種方式是只在composite裡面宣告所有用來管理子類的方法,下圖所示,這樣就避免了上一種方式的安全性問題,但是由於葉子和分支不同,失去了透明性。
設計模式之組合模式
組合模式 以 整體 部分 的層次結構,將物件以樹型結構組合起來。如下圖所示 組合模式首先得定義乙個用來管理和訪問部件們的抽象類。public abstract class equipment 再建立乙個組合體的部件 class element equipment 現在我們再來定義乙個組合體,也就是組...
設計模式之 組合模式
有時候我們需要維護一些物件,這些物件具有一定的層次結構,它們之間雖然差異很大,但在使用的時候我們希望能構一致的對待,比如windows控制項,繪圖中的圖形等,這個時候我們就可以採用組合模式來進行管理。組合模式就是將要管理的物件按樹型結構來進行組織,表示成一種 整體 部分 的層次結構,使得使用者對單個...
設計模式之組合模式
組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構。使得使用者對單個物件和組合物件的使用具有一致性。適用性 想表示物件的部分 整體層次結構,希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。典型表示結構圖 宣告組合中的物件宣告介面 在適當的情況下,實現所有類共...