概念:將物件組合成樹形結構以表示「部分-整體」的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。如:word文件中對文字的處理,即可以處理單個字又可以處理多個字、甚至是對整個文件的處理;再比如說總公司和各個分公司在職務功能都類似,但是子公司包含於總公司之中,如下圖的結構:
component類:
class component
//通過add和remove來實現增加樹葉或者樹枝的功能
virtual void add(component *c){};
virtual void remove(component *c){};
virtual void display(int depth){};
};
leaf類:
class leaf :public component
void add(component *c) override
void remove(component *c) override
void display(int depth) override
};
composite類:
class composite :public component
void add(component *c) override
void remove(component *c) override
void display(int depth) override
};
client.h類
int main()
leaf(葉子)中也可以不實現add和remove方法,因為實現他們沒有意義,這種方式成為安全方式,不過由於不透明,所以樹葉樹枝將不具有相同的介面,從而使得客戶端的呼叫就需要判斷一下;著這種角度來講,這種方式就不如透明方式了。
使用場景:
優點:
公司類component.h
#ifndef _company_h_
#define _component_h
#include#include#includeusing std::endl;
using std::cout;
using std::string;
using std::vector;
class company
virtual string getname()//返回公司名字
virtual void add(company *c){};//增加
virtual void remove(company *c){};//移除
virtual void display(int depth){};//顯示
virtual void lineofduty(){};//履行職責,不同的部門需要履行不同的職責
};//建立具體的公司
class concretecompany :public company
//增加析構函式,防止記憶體洩漏
~concretecompany()
delete vec;
} string getname() override
//增加葉子結點
void add(company *c) override
//刪除葉子結點
void remove(company *c) override
}} //列印
void display(int depth) override
//職責
void lineofduty() override };
//人力資源部
class hrdepartment :public company
void add(company *c) override{}
void remove(company *c) override{}
void display(int depth) override
void lineofduty() override
string getname() override };
//財務部
class financedepartment :public company
void add(company *c) override{}
void remove(company *c) override{}
void display(int depth) override
void lineofduty() override
string getname() override };
#endif
客戶端**:
#include"component.h"
int main()
執行結果:
結構圖
-北京總公司
-----總公司人力資源部
-----總公司財務部
-----上海華東分公司
---------上海華東分公司人力資源部
---------上海華東分公司財務部
---------南京辦事處
-------------南京辦事處人力資源部
-------------南京辦事處財務部
---------杭州辦事處
-------------杭州辦事處人力資源部
-------------杭州辦事處財務部
職責總公司人力資源部 負責招聘培訓管理
總公司財務部 公司財務收支管理
上海華東分公司人力資源部 負責招聘培訓管理
上海華東分公司財務部 公司財務收支管理
南京辦事處人力資源部 負責招聘培訓管理
南京辦事處財務部 公司財務收支管理
杭州辦事處人力資源部 負責招聘培訓管理
杭州辦事處財務部 公司財務收支管理
請按任意鍵繼續. . .
設計模式19 組合模式
將一種物件組合成樹狀層次結構的模式。1 對樹上的物件處理一致。2 可以容易在組合內加入新的物件,而不改源 1 對樹的邏輯需要樹立清楚。2 不容易使用繼承的方法增加功能。1 抽象構件 樹葉和樹枝的抽象類。2 樹葉構件 沒有子節點。3 樹枝構件 管理樹葉構件。1.抽象構件 class component...
設計模式19 組合模式
組合物件介面宣告 class component 增加或移除樹葉或樹枝的功能 virtual void add component c 0 virtual void remove component c 0 virtual void display int depth 0 protected str...
大話設計模式10 組合模式 2020 9 24
組合模式 將物件組合成樹形結構來表示 部分 整體 的關係,組合模式使得單個物件和組合物件使用具有一致性。uml類圖如下 實現乙個公司的辦公管理系統,父公司下面可能既有子部門也有子公司。uml類圖如下 c 實現如下 include include include include using names...