設計模式之組合模式

2022-08-05 14:03:22 字數 1479 閱讀 4455

組合(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裡面宣告所有用來管理子類的方法,下圖所示,這樣就避免了上一種方式的安全性問題,但是由於葉子和分支不同,失去了透明性。

設計模式之命令模式

命令模式,將一個請求封裝為一個物件,從而使得可以用不同的請求進行引數化,對請求排隊或者記錄請求日誌以及支援可撤銷的操作。 命令模式是對命令進...

設計模式之命令模式

命令模式 將一個請求封裝為一個物件,從而是你可用不同的請求對客戶進行引數化 對請求排隊或記錄請求日誌,以及支援可撤銷的操作。 命令模式有如下...

設計模式之命令模式

平時我們下館子吃各種各樣的美食時,總會發現我們都是通過服務員來點餐的,而不會直接告訴廚師我們想吃什麼。這其中就包含一個設計模式 命令模式。...