Aha!設計模式 54 組合模式 1

2021-09-12 13:04:14 字數 1045 閱讀 5513

意圖

使用組合的方式管理下級要素,在實現乙個樹形資料結構的同時為各級節點提供相同的介面,使用者可以以相同的觀點看待樹上的每個節點。

動機

現實世界中存在很多的樹形結構,先看兩個例子。首先是公司組織結構圖:

接下來是電腦構成圖:

通過觀察可以發現,這兩個例子中的樹形結構具有以下的特徵:

樹上存在包含其他節點的父節點,也存在不包含其他節點的頁子節點。

父節點和下級節點可以看作是整體和部分的關係

下級節點也有可能是其他節點的父節點。

這種包含關係可能會有很多層。

通常會存在一些共通操作,需要從父節點擴散到子節點。

最後一點圖中沒有體現,這裡進行補充說明。所謂的共通操作,對於公司組織圖來說,可以是發布通知,收集績效資料,考評等;對於計算機來說可以是開關電源等。當然,實際需要哪種操作時根據需求決定的,但是一般的情況下都可以很容易地找出共通操作。

對於上面的樹狀結構建模時,一般的方法就是為每種要素設計乙個類,但是這樣一來有乙個問題:包含其他要素的父節點類都有兩個共通功能:乙個是需要管理子節點,乙個是要擴散操作。於是對類圖進行優化,得到下面的類圖。

在這個類圖中partsgroup承擔了管理子節點和擴散共通操作的職責。它可以管理任何的parts類,也包含另外的partsgroup物件。這種組合關係可以根據需求多次重複。

這樣一來,利用者就不必關心具體的節點型別,是否包含下級節點,有多少層下級節點,只管對眼前的節點呼叫其操作就好了。

Aha!設計模式 55 組合模式 2

適用性 組合模式的適用場景很明確 只要是樹形資料結構都可以考慮適用組合模式。結構 參與者 component graphic 為樹形資料結構上的節點宣告標準介面。和所有的基類一樣,也可以根據實際情況為某些結構提供預設實現。宣告用於訪問和管理下級節點的介面。leaf rectangle line te...

設計模式8 組合模式

組合模式首先想到的就是樹形結構,比如我們常用的檔案結構,請看windows的檔案結構 無論是檔案或者是資料夾,常用操作都是一致的,比如 複製 貼上 剪下 刪除 所佔空間大小。我們並沒有刻意的去分他是資料夾還是檔案。我們可以把資料夾看成是組合物件,把每乙個檔案看成是單個物件。組合模式模糊了這兩個概念,...

《設計模式12 組合模式

組合模式其實是乙個很形象的模式。它也被稱為部分整體模式。組合模式的結構就如同樹狀圖一樣。而樹就是枝幹 葉子的組合,組合模式可以形象的這麼理解。其實資料夾是乙個很好的組合模式的體現。乙個資料夾 樹根root 下可能有多個資料夾 枝幹trunk 可能是單個的檔案 樹葉leaf 而枝幹是可以繼續向下延伸的...