C 組合模式

2021-09-23 14:58:34 字數 4313 閱讀 5035

組合模式(composite pattern)組合多個物件形成樹形結構以表示具有「整體-部分」關係的層次結構。組合模式對單個物件(即:葉子構件)和組合物件(即:容器構件)的使用具有一致性,組合模式又被稱為「整體-部分」(part-whole)模式,屬於物件結構型模式。

uml 結構圖(透明組合模式):

uml 結構圖(安全組合模式):

根據 component 的定義形式,可將組合模式分為兩種形式:

透明組合模式包含以下特點:

安全組合模式包含以下特點:

透明組合模式的缺點是不夠安全,因為 leaf 和 composite 在本質上是有區別的。leaf 不可能有下乙個層級,因此為其提供 add()、remove()、getchild() 等介面沒有意義。這在編譯階段不會出錯,但在執行階段如果呼叫這些介面可能會出錯(如果沒有提供相應的異常處理)。

安全組合模式的缺點是不夠透明,因為 leaf 和 composite 具有不同的介面,且 composite 中那些用於訪問和管理子構建的介面沒有在 component 中定義,因此 client 不能完全針對抽象程式設計,必須有區別地對待 leaf 和 composite。

ps:透明組合模式是組合模式的標準形式,但在實際應用中,安全組合模式的使用頻率也非常高。

優點: 缺點:

只要有人的地方就有恩怨,有恩怨就會有江湖,人就是江湖!

– 金庸《笑傲江湖》

江湖公司由任我行一手建立,理所當然,他就是董事長。下設總經理一職,原本讓令狐沖擔任,卻被婉拒,所以只能由自己兼任。再往下就是各事業部:日月神教、五岳劍派、以及其他門派等。

日月神教的頭兒叫做教主(東方不敗),底下有光明左右使、十大長老、堂主、舵主、香主等。

五岳劍派的頭兒叫做盟主(左冷蟬),各派分別為:嵩山(左冷蟬)、泰山(天門道長)、衡山(莫大)、華山(岳不群)、恆山(定閒師太),各頭目被稱為掌門。

另外,還有一些很 nb 的部門,不僅歷史悠久,而且威望超高,是武林中的泰山北斗:少林(方證大師)、武當(沖虛道長)。。。

建立抽象構件

component 需要定義訪問及管理子構件的介面:

// component.h

#ifndef component_h

#define component_h

#include

#include

using namespace std;

class component

virtual ~component() {}

virtual

void add(component *cmpt) = 0; // 新增構件

virtual

void remove(component *cmpt) = 0; // 刪除構件

virtual component* getchild(int index) = 0; // 獲取構件

virtual

void operation(int indent) = 0; // 顯示構件(以縮排的方式)

private:

component(); // 不允許

protected:

string m_strname;

};#endif // component_h

建立葉子構件作為 component 的子類,leaf 需要實現 component 中定義的所有介面,但是 leaf 不能包含子構件。因此,在 leaf 中實現訪問和管理子構件的函式時,需要進行異常處理或錯誤提示。當然,這無疑會給 leaf 的實現帶來麻煩。

// leaf.h

#ifndef leaf_h

#define leaf_h

#include "component.h"

class leaf : public component

virtual ~leaf(){}

void add(component *cmpt)

void remove(component *cmpt)

component* getchild(int index)

void operation(int indent) ;

#endif // leaf_h

建立容器構件由於容器構件中可以包含子節點,因此對容器構件進行處理時可以使用遞迴方式。

// composite.h

#ifndef composite_h

#define composite_h

#include

#include "component.h"

#ifndef safe_delete

#define safe_delete(p) }

#endif

class composite : public component

virtual ~composite()

}void add(component *cmpt)

void remove(component *cmpt)

++it;}}

component* getchild(int index)

// 遞迴顯示

void operation(int indent)

}private:

composite(); // 不允許

private:

vector

m_elements;

};#endif // composite_h

建立客戶端最終,來看看任大教主的組織結構:

// main.cpp

#include

"composite.h"

#include

"leaf.h"

int main()

輸出如下:

-+ 江湖公司(任我行)

—+ 日月神教(東方不敗)

—– 光明左使(向問天)

—– 光明右使(曲洋)

—+ 五岳劍派(左冷蟬)

—– 嵩山(左冷蟬)

—– 衡山(莫大)

—– 華山(岳不群)

—– 泰山(天門道長)

—– 恆山(定閒師太)

— 少林(方證大師)

— 武當(沖虛道長)

建立抽象構件

// component.h

#ifndef component_h

#define component_h

#include

#include

using namespace std;

class component

virtual ~component() {}

virtual

void operation(int indent) = 0; // 顯示構件(以縮排的方式)

private:

component(); // 不允許

protected:

string m_strname;

};#endif // component_h

建立葉子構件

// leaf.h

#ifndef leaf_h

#define leaf_h

#include "component.h"

class leaf : public component

virtual ~leaf(){}

void operation(int indent) ;

#endif // leaf_h

注意:與透明模式不同,這裡已經沒有了訪問及管理子構件的介面,所有的介面都在 composite 中,不再贅述(同上)。

c 組合模式

include include include using namespace std class company virtual void add company c virtual void remove company c virtual void display int depth virt...

組合模式 C

組合模式 又叫部分整體模式,是用於把一組相似物件當做乙個單一物件.組合模式依據樹形結構來組合物件,用來表示部分以及整體層次.屬於結構型模式.目的 將物件組合成樹形結構以表示 部分 整體 的層次關.組合模式使得使用者對單個物件和組合物件的使用具有一致性.優點 缺點 使用場景 本示例copy自 關鍵 樹...

C 設計模式 組合模式

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