組合模式 設計模式系列之組合模式解析

2021-10-14 17:13:07 字數 1566 閱讀 7191

今天為大家帶來死磕設計模式系列的第11個模式,屬於結構型模式的--組合模式

什麼是組合模式?

組合模式解決了什麼問題?

適用場景是什麼?

將物件組合成樹形結構以表示「部分-整體」的層次結構。composite 使得使用者對單個物件和組合物件的使用具有一致性。
如果業務中需要定義複雜的資料結構,可以用樹形巢狀來表示,那麼組合模式就有用武之地了。

比如在繪圖編輯器中,使用者可以使用簡單的元件建立複雜的圖表。使用者可以組合多個簡單元件以形成一些較大的元件,這些元件又可以組合成更大的元件。

然後這種方法存在乙個問題:使用這些類的**必須區別對待這些不同的元件,而實際上大多數使用者認為他們是一樣的。 composite 模式描述了如何使用遞迴組合,使得使用者不必對這些類進行區別。

composite 模式的關鍵是乙個抽象類(這裡介面也屬於抽象類範圍,自由使用),它既可以表示葉節點,也可以表示容器,即圖中的 component,它宣告了物件相關的操作。

以下情況適用 composite 模式:

組合模式為你提供了兩種共享公共介面的基本元素型別: 簡單葉節點和複雜容器。 容器中可以包含葉節點和其他容器。 這使得你可以構建樹狀巢狀遞迴物件結構。

你希望使用者忽略組合物件與單個物件之間的不同,使用者將統一地使用組合結構中的所有物件。

使用者使用 component 類介面與組合結構中的物件進行互動。如果接收者是乙個葉節點,則直接處理請求。如果接收者是 composite ,它通常將請求傳送給它的子部件,在**請求之前或之後執行一些輔助操作。

定義了包含基本物件和組合物件和類層次結構。 基本物件可以被組合成更複雜的組合物件,而這個組合又可以被組合,這樣不斷的遞迴下去。客戶**中,任何用到基本物件的地方都可以使用組合物件。

簡化客戶**。 客戶可以一致性的使用組合和單個物件,通常使用者不知道也不關心處理的是乙個葉節點還是乙個組合容器。

使得更容易增加新型別的元件。 新定義的 composite 或者 leaf 子類自動與已有結構和客戶**一起工作。

這個實現有乙個點是需要注意的,就是我們的 composite 中宣告了對子部件管理的操作,add()、remove() ,問題在於:這些操作應該定義在哪乙個類層次中。我們是應該在 component(圖中graph) 中宣告使其對 leaf 類有意義呢?還是只應該在 composite(圖中compoundgraphic) 和它的子類中宣告並定義這些操作呢?

這需要在安全性和透明性之間做出權衡。

一般在組合模式中,相對於安全性我們更強調透明性

看到這裡的朋友恭喜你,在通往模式大師的路上又進了一步,技能庫中收入了我們的組合模式,希望你可以多思考去實踐掌握。

本文全!fighting

設計模式系列 組合模式

今天下班客廳的燈確實亮堂了許多,照照鏡子感覺自己一下蒼老許多,看來還是燈光暗比較好,看不出來自己的憔悴啊,哈哈,其實還是頭髮長了,決定出去剪髮。到家後稍微有點後悔,我竟然一時衝動花了那麼多錢辦了張剪髮的會員卡,不過辦也辦了,只好自己安慰安慰自己,心想,辦了卡可以打折上折,而且那麼多分店想去哪家去哪家...

組合模式 設計模式 組合模式

1.需求分析 假設要給乙個大公司做辦公管理系統,公司有人力資源部 財務部等,然後公司在其他城市還有分公司,分公司也有自己的人力資源部 財務部等,要求總公司 分公司以及各部分成樹狀結構管理。要完成這麼乙個系統,為了有乙個更好的設計,方便開發的展開,就需要了解乙個設計模式 組合模式。2.定義 將物件組合...

設計模式之組合模式

組合模式 以 整體 部分 的層次結構,將物件以樹型結構組合起來。如下圖所示 組合模式首先得定義乙個用來管理和訪問部件們的抽象類。public abstract class equipment 再建立乙個組合體的部件 class element equipment 現在我們再來定義乙個組合體,也就是組...