大話設計模式19 組合模式

2021-07-15 13:18:22 字數 3398 閱讀 7573

概念:將物件組合成樹形結構以表示「部分-整體」的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。如: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...