c 設計模式 組合模式

2022-08-20 22:03:20 字數 1830 閱讀 6251

動機

在某些情況下,客戶**過多地依賴物件容器複雜的內部實現結構,物件容器內部實現結構(而非抽象介面)的變化將引起客戶**的頻繁變化,帶來了**難以維護、擴充套件的弊端。

如何將「客戶**與複雜的物件容器結構」解耦?讓物件容器自己來實現自身的複雜結構,從而使得客戶**就像處理簡單物件一樣來處理複雜的物件容器?

定義

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

結構

為組合中的物件宣告介面;

在適當的情況下,實現所有類共有介面的預設行為;

宣告乙個介面用於訪問和管理component的子元件。

leaf:

在組合中表示葉節點物件,葉節點沒有子節點;

在組合中定義葉節點的行為。

composite:

定義有子部件的那些部件的行為;

儲存子部件。

client:

通過component介面操作組合部件的物件。

組合模式(composite)將小物件組合成樹形結構,使使用者操作組合物件如同操作乙個單個物件。組合模式定義了「部分-整體」的層次結構,基本物件可以被組合成更大的物件,而且這種操作是可重複的,不斷重複下去就可以得到乙個非常大的組合物件,但這些組合物件與基本物件擁有相同的介面,因而組合是透明的,用法完全一致。

示例

class component

};//樹節點

class composite : public component

void add(component* element)

void remove(component* element)

void process()

};//葉子節點

class leaf : public component

void process()

};void invoke(component & c)

int main()

實現要點1.composite的關鍵之一在於乙個抽象類,它既可以代表leaf,又可以代表composite;所以在實際實現時,應該最大化component介面,component類應為leaf和composite類盡可能多定義一些公共操作。component類通常為這些操作提供預設的實現,而leaf和composite子類可以對它們進行重定義;

2.記憶體的釋放;由於存在樹形結構,當父節點都被銷毀時,所有的子節點也必須被銷毀,所以,可以在析構函式中對維護的component列表進行統一銷毀。

3.由於在component介面提供了最大化的介面定義,導致一些操作對於leaf節點來說並不適用,比如:leaf節點並不能進行add和remove操作,由於composite模式遮蔽了部分與整體的區別,為了防止客戶對leaf進行非法的add和remove操作,所以,在實際開發過程中,進行add和remove操作時,需要進行對應的判斷,判斷當前節點是否為composite。

應用場景

當發現需求中是體現部分與整體層次結構時,以及你希望使用者可以忽略組合物件與單個物件的不同,統一地使用組合結構中的所有物件時,就應該考慮組合模式了

C 設計模式 組合模式

一.概述 組合模式,將物件組合成樹形結構以表示 部分 整體 的層次結構,組合模式使得使用者對單個物件和組合物件的使用具有一致性。結構 1.component 是組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告乙個介面用於訪問和管理component子部件。2.leaf 在組合...

C 設計模式 組合模式

一 組合模式的定義 組合多個物件形成樹形結構以表示具有部分 整體關係的層次結構。二 說明 組合模式關注那些包含葉子構件和容器構件的結構以及它們的組織形式,在葉子結構中不包含成員物件,而容器構件中包含成員物件,這些物件通過遞迴組合可構成乙個樹形結構。由於容器物件和葉子物件在功能上存在區別,因此在使用這...

C 設計模式 組合模式

ifndef composite h define composite h include include include 說明 組合模式的關鍵是定義了乙個抽象構件類,它既可以代表葉子,又可以代表容器,而客戶端針對該抽象構件類進行程式設計,無須知道它到底表示的是葉子還是容器,可以對其進行統一處理。同...