組合模式(composite pattern)組合多個物件形成樹形結構以表示具有「整體-部分」關係的層次結構。組合模式對單個物件(即:葉子構件)和組合物件(即:容器構件)的使用具有一致性,組合模式又被稱為「整體-部分」(part-whole)模式,屬於物件結構型模式。
uml 結構圖(透明組合模式):
uml 結構圖(安全組合模式):
根據 component 的定義形式,可將組合模式分為兩種形式:
透明組合模式包含以下特點:
安全組合模式包含以下特點:
透明組合模式的缺點是不夠安全,因為 leaf 和 composite 在本質上是有區別的。leaf 不可能有下乙個層級,因此為其提供 add()、remove()、getchild() 等介面沒有意義。這在編譯階段不會出錯,但在執行階段如果呼叫這些介面可能會出錯(如果沒有提供相應的異常處理)。
安全組合模式的缺點是不夠透明,因為 leaf 和 composite 具有不同的介面,且 composite 中那些用於訪問和管理子構建的介面沒有在 component 中定義,因此 client 不能完全針對抽象程式設計,必須有區別地對待 leaf 和 composite。
ps:透明組合模式是組合模式的標準形式,但在實際應用中,安全組合模式的使用頻率也非常高。
優點: 缺點:
只要有人的地方就有恩怨,有恩怨就會有江湖,人就是江湖!– 金庸《笑傲江湖》
江湖公司由任我行一手建立,理所當然,他就是董事長。下設總經理一職,原本讓令狐沖擔任,卻被婉拒,所以只能由自己兼任。再往下就是各事業部:日月神教、五岳劍派、以及其他門派等。
日月神教的頭兒叫做教主(東方不敗),底下有光明左右使、十大長老、堂主、舵主、香主等。
五岳劍派的頭兒叫做盟主(左冷蟬),各派分別為:嵩山(左冷蟬)、泰山(天門道長)、衡山(莫大)、華山(岳不群)、恆山(定閒師太),各頭目被稱為掌門。
另外,還有一些很 nb 的部門,不僅歷史悠久,而且威望超高,是武林中的泰山北斗:少林(方證大師)、武當(沖虛道長)。。。
建立抽象構件
component 需要定義訪問及管理子構件的介面:
建立葉子構件作為 component 的子類,leaf 需要實現 component 中定義的所有介面,但是 leaf 不能包含子構件。因此,在 leaf 中實現訪問和管理子構件的函式時,需要進行異常處理或錯誤提示。當然,這無疑會給 leaf 的實現帶來麻煩。// 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
建立容器構件由於容器構件中可以包含子節點,因此對容器構件進行處理時可以使用遞迴方式。// 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
注意:與透明模式不同,這裡已經沒有了訪問及管理子構件的介面,所有的介面都在 composite 中,不再贅述(同上)。// leaf.h
#ifndef leaf_h
#define leaf_h
#include "component.h"
class leaf : public component
virtual ~leaf(){}
void operation(int indent) ;
#endif // leaf_h
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 在組合...