定 義:將物件組合成樹形結構以表示「整體-部分」的層次結構,使得使用者對單個物件和組合物件的使用具有一致性
優 點:
1、高層模組呼叫簡單
2、節點自由增加
使用場景: 1
.你想表示物件的部分
-整體層次結構 2
.你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。
總結:組合模式解耦了客戶程式與複雜元素內部結構,從而使客戶程式可以向處理簡單元素一樣來處理複雜元素
實際應用:
先來看看組合模式的類圖設計:
composite
模式採用樹形結構來實現普遍存在的物件容器,從而將「一對多」的關係轉化「一對一」的關係,使得客戶**可以一致地處理物件和物件容器,無需關心處理的是單個的物件,還是組合的物件容器。 2
.將「客戶**與複雜的物件容器結構」解耦是
composite
模式的核心思想,解耦之後,客戶**將與純粹的抽象介面——而非物件容器的復內部實現結構——發生依賴關係,從而更能「應對變化」。 3
.composite
模式中,是將「
add和
remove
等和物件容器相關的方法」定義在「表示抽象物件的
component
類」中,還是將其定義在「表示物件容器的
composite
類」中,是乙個關乎「透明性」和「安全性」的兩難問題,需要仔細權衡。這裡有可能違背物件導向的「單一職責原則」,但是對於這種特殊結構,這又是必須付出的代價。
asp.net
控制項的實現在這方面為我們提供了乙個很好的示範。 4
.composite
模式在具體實現中,可以讓父物件中的子物件反向追溯;如果父物件有頻繁的遍歷需求,可使用快取技巧來改善效率
來看乙個例子,用程式來實現乙個複雜的算術表示式的時候,將複雜的算術表示式可以拆分成簡單的表示式,那麼複雜的表示式與簡單表示式組成了部分-整體的關係,也組合成乙個樹形結構,那麼這種情況下,非常的適合用組合模式,例如(2+3)+(4*6),就可以組成乙個樹形結構。用uml描述如下:
再來看看系統中的許可權設定,是乙個典型的樹形結構,有很多操作方法,如從資料庫中讀取相關角色的許可權初始化樹形結構,再根據使用者選擇的許可權獲得樹形結構許可權,儲存到資料庫中,並且在選擇父類節點的時候同時要選擇所有的子類節點,取消也是,選擇子類節點,自然要選中父類節點。在沒有採用組合模式前,顯示得很混亂,往往要加乙個功能或者減少乙個功能的工作量很複雜,採用組合模式以後,我可以將所有的許可權資料都儲存到資料庫中,動態載入到頁面,這樣避免了每次調整乙個許可權都要重新編譯系統,然後在客戶端生成組合模式的樹形結構,並定義每乙個節點的操作方法,那麼整個使用者角色設定流程就顯得非常的可擴充套件了。
看看乙個公司的組織架構圖用組合模式來實現:
設計模式 15 組合設計模式
目錄 什麼是組合模式 為什麼要用組合模式 組合模式組成 由每乙個單元節點,組合成乙個整體節點,這種對單個節點的結構儲存和對整體節點的儲存和處理邏輯保持一致的設計模式便是組合設計模式。應用中有很多場景會用到組合模式,例如樹狀儲存的結構,比如多級選單,每一層級選單的處理都可以抽象保持一致。比如企業的組織...
15 組合模式
定義 將物件組合成樹形結構以表示 部門 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。適用 當發現需求中是體現部分與整體層次的結構時,以及你希望使用者可以忽略組合物件與單個物件的不同,同意地適用組合結構中的所有物件時,就應該考慮用組合模式了。asp.net的treevie...
15 組合模式
組合模式 composite 將物件組合成樹形結構以表示 部分整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。組合模式uml結構圖 組合模式的實現根據所實現介面的區別分為兩種形式,分別稱為安全模式和透明模式。組合模式可以不提供父物件的管理方法,但組合模式必須在合適的地方提供...