設計模式 組合設計模式

2022-05-20 15:32:09 字數 1349 閱讀 7226

組合模式(composite pattern),又稱部分整體模式,用於把一組相似的物件當做乙個單一的物件,組合模式依據樹形來組合物件,用來表示部分以及整體層次,為結構型設計模式,它建立來物件組的樹形結構。

意圖:將物件組合成樹形結構以表示「部分-整體」的結構層次,組合模式使得使用者對單個物件和組合物件的使用具有一致性。

主要解決:在樹形結構的問題中,模糊類簡單元素和複雜元素的概念,客戶程式可以像處理簡單元素一樣來處理複雜元素,從而使客戶程式與複雜元素的內部結構解耦

使用場景:1、想要表達物件的部分-整體層次結構(樹形結構)。2希望使用者忽略組合物件與單個物件的不同,使用者統一使用組合結構中的物件。

關鍵**:樹枝和葉子實現統一介面,樹枝內部組合該介面並且內部含屬性list,裡面放component。

注意:1)組合模式不是父子關係

組合模式的樹形結構容易讓人誤認為是組合物件和也物件的父子關係,這是不正確的。組合物件和葉子物件對組合介面實現是不同的,尤其是葉子物件沒有對list的操作。

組合模式是一種has-a(聚合)的關係,而非is-a,組合物件包含一組葉物件,葉物件可能也是組合物件,也可能是真正的葉物件,就好比資料夾下面可能是檔案,也可能是子資料夾,子資料夾下再包含檔案。

2)對葉物件操作的一致性

組合模式除了要求組合物件和葉物件有相同的介面之外,還有乙個必要的條件:對一組葉物件的操作必須具有一致性。

3)雙向對映關係

乙個葉物件可能屬於多個組合物件,這樣物件自檢的關係不是嚴格意義上的層次結構,這種情況必須給父節點和子節點建立雙向對映關係,簡單的做法就是給組合物件和葉物件都增加集合來儲存物件的引用。這樣會使物件之間的耦合性增強,修改和增刪乙個物件都會變得困難,此時可以引入中介模式來管理這些物件

4)用職責鏈模式提高組合模式效能

在組合模式中,如果樹的結構比較複雜,節點數量很多,在遍歷樹的過程中,效能方面也許表現得不夠理想。有時候我們確實可以借助一些技巧,在實際操作中避免遍歷整棵樹,有一種現成的方案是借助職責鏈模式。職責鏈模式一般需要我們手動去設定 鏈條,但在組合模式中,父物件和子物件之間實際上形成了天然的職責鏈。讓請求順著鏈條從父物件往子物件傳遞,或者是反過來從子物件往父物件傳遞,直到遇到可以處理該請求的物件為止,這也是職責鏈模式的經典運用場景之一。

5)與其它模式關係

與裝飾模式經常一起使用時,他們通常會用乙個公共的類,所以裝飾必須具有add、remove和getchild 操作的component介面。

經常與迭代器模式一起使用,進行遍歷composite;

觀察者模式 visitor將本來應該分布在composite和l e a f類中的操作和行為區域性化

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

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

設計模式 組合模式

定義 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。範例一 using system using system.collections.generic using system.text namespace 組合模式 範例二 公司管理系統...

設計模式 組合模式

1 menucomponent.h ifndef menucomponent h define menucomponent h include class menucomponent 組合物件基類component 建構函式 menucomponent std string strname m st...