24種設計模式學習筆記之組合模式

2022-03-14 06:03:37 字數 2995 閱讀 7520

組合模式(composite pattern)---結構型設計模式

也稱為 整體-部分(part-whole)模式,它的宗旨是通過將單個物件(葉子節點)和組合物件(樹枝節點)用相同的介面進行表示,使得客戶對單個物件和組合物件的使用具有一致性。

組合模式 一般用來描述 整體 與 部分 的關係,它將物件組織到樹形結構中,

最頂層的節點稱為根節點,根節點下面可以包含樹枝節點葉子節點,樹枝節點下面又可以包含樹枝節點葉子節點

如下圖所示:

由上圖可以看出,其實根節點樹枝節點本質上是同一種資料型別(藍色圓圈),可以作為容器使用;

葉子節點樹枝節點在語義上不屬於同一種型別,但是在 組合模式 中,會把樹枝節點葉子節點認為是同一種資料型別(用同一介面定義),讓它們具備一致行為。

這樣,在 組合模式 中,整個樹形結構中的物件都是同一種型別,帶來的乙個好處就是客戶無需辨別樹枝節點還是葉子節點,而是可以直接進行操作,給客戶使用帶來極大的便利。

組合模式 核心:借助同一介面,使葉子節點和樹枝節點的操作具備一致性。

當子系統與其內各個物件層次呈現樹形結構時,可以使用 組合模式 讓該子系統內各個物件層次的行為操作具備一致性。客戶端使用該子系統內任意乙個層次物件時,無須進行區分,直接使用通用操作即可,為客戶端的使用帶來了便捷。

:如果樹形結構系統不使用 組合模式 進行架構,那麼按照正常的思維邏輯,對該系統進行職責分析,按上文樹形結構圖所示,該系統具備兩種物件層次型別:樹枝節點和葉子節點。那麼我們就需要構造兩種對應的型別,然後由於樹枝節點具備容器功能,因此樹枝節點類內部需維護多個集合儲存其他物件層次(eg:list,list),如果當前系統物件層次更複雜時,那麼樹枝節點內就又要增加對應的層次集合,這對樹枝節點的構建帶來了巨大的複雜性,臃腫性以及不可擴充套件性。同時客戶端訪問該系統層次時,還需進行層次區分,這樣才能使用對應的行為,給客戶端的使用也帶來了巨大的複雜性。而如果使用 組合模式 構建該系統,由於 組合模式 抽取了系統各個層次的共性行為,具體層次只需按需實現所需行為即可,這樣子系統各個層次就都屬於同一種型別,所以樹枝節點只需維護乙個集合(list)即可儲存系統所有層次內容,並且客戶端也無需區分該系統各個層次物件,對內系統架構簡潔優雅,對外介面精簡易用。

優點

缺點

組合模式 主要包含三種角色:

組合模式 在**具體實現上,有兩種不同的方式:

透明模式:把組合(樹節點)使用的方法放到統一行為(component)中,讓不同層次(樹節點,葉子節點)的結構都具備一致行為;其 uml 類圖如下所示:

透明組合模式把所有公共方法都定義在 component 中,這樣做的好處是客戶端無需分辨是葉子節點(leaf)和樹枝節點(composite),它們具備完全一致的介面;

缺點是葉子節點(leaf)會繼承得到一些它所不需要(管理子類操作的方法)的方法,這與設計模式 介面隔離原則 相違背。

2.安全模式:統一行為(component)只規定系統各個層次的最基礎的一致行為,

而把組合(樹節點)本身的方法(管理子類物件的新增,刪除等)放到自身當中;其 uml 類圖如下所示:

安全組合模式把系統各層次公有的行為定義在 component 中,把組合(樹節點)特有的行為(管理子類增加,刪除等)放到自身(composite)中。

這樣做的好處是介面定義職責清晰,符合設計模式 單一職責原則 和 介面隔離原則;

缺點是客戶需要區分樹枝節點(composite)和葉子節點(leaf),這樣才能正確處理各個層次的操作,客戶端無法依賴抽象(component),違背了設計模式 依賴倒置原則。

透明組合模式安全組合模式都有各自的優點和缺點,那麼我們應該優先選擇哪一種呢?

:既然 組合模式 會被分為兩種實現,那麼肯定是不同的場合某一種會更加適合,也即具體情況具體分析。透明組合模式將公共介面封裝到抽象根節點(component)中,那麼系統所有節點就具備一致行為,所以如果當系統絕大多數層次具備相同的公共行為時,採用透明組合模式也許會更好(代價:為剩下少數層次節點引入不需要的方法);而如果當系統各個層次差異性行為較多或者樹節點層次相對穩定(健壯)時,採用安全組合模式

:設計模式的出現並不是說我們要寫的**一定要遵循設計模式所要求的方方面面,這是不現實同時也是不可能的。設計模式的出現,其實只是強調好的**所具備的一些特徵(六大設計原則),這些特徵對於專案開發是具備積極效應的,但不是說我們每實現乙個類就一定要全部滿足設計模式的要求,如果真的存在完全滿足設計模式的要求,反而可能存在過度設計的嫌疑。同時,23種設計模式,其實都是嚴格依循設計模式六大原則進行設計,只是不同的模式在不同的場景中會更加適用。設計模式的理解應該重於意而不是形,真正編碼時,經常使用的是某種設計模式的變形體,真正切合專案的模式才是正確的模式。

24種設計模式學習筆記之策略模式

策略模式 strategy 行為型設計模式 定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。cashsuper 收費計算策略抽象類正常收費類 正常收費。acceptcash 辦法 直接返回金額 打折收費類 需要在構造器中初始化打折引數 在ac...

24種設計模式學習筆記之模板方法模式

模板方法模式 行為型設計模式 定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。模板方法模式 template method pattern 實際上是封裝了乙個固定流程,該流程由幾個步驟組成,具體步驟可以由子類進行不同實現,從...

設計模式學習筆記之組合模式

組合模式 允許你將物件組合成樹形結構來表現 整體 部分 層次結構。組合能讓客戶以一致的方式處理個別物件以及物件組合。使用組合結構,我們能把相同的操作應用在組合和個別物件上。換句話說,在大多數情況下,我們可以忽略物件組合和個別物件之間的差別。說明 1 組合模式使新增或者刪除子節點變得容易 場景 1 想...