组合模式
意图:
将对象组合成树形结构以表示‘部分-整体’的层次结构,所以有时候又叫做部分-整体模式。组合模式使得用户对单个对象和组合对象的使用具有一致性。,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
适用性:
当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时。
优点:
组合模式使得基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。
组合模式让客户可以一致的使用组合结构和单个对象。
UML:
抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。在安全式的合成模式里,构件角色并不是定义出管理子对象的方法,这一定义由树枝构件对象给出。
树叶构件(Leaf)角色:树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。
树枝构件(Composite)角色:代表参加组合的有下级子对象的对象。树枝对象给出所有的管理子对象的方法,如add()、remove()、getChild()等。
代码实现:输出对应公司结构和其部门职责,这里总公司、分公司、各种部门都有共同的接口
composite.h实现:
1 #ifndef COMPOSITE_H
2 #define COMPOSITE_H
3
4 #include <list>
5 using std::list;
6
7 #include <string>
8 using std::string;
9
10 #include <iostream>
11 using namespace std;
12
13 class Company
14 {
15 public:
16 Company(char* name):mName(name){}
17 virtual void attach(Company* cpn){}
18 virtual void detach(Company* cpn){}
19 virtual void display(string str){}
20
21 virtual void LineOfDuty(string company){}
22
23 protected:
24 char* mName;
25 list<Company* > mList;
26 };
27
28 class ConcreteCompany:public Company{
29 public:
30 ConcreteCompany(char* name):Company(name){}
31 virtual void attach(Company* cpn);
32 virtual void detach(Company* cpn);
33 virtual void display(string str);
34 virtual void LineOfDuty(string company);
35 };
36
37 class HrDepartment:public Company{
38 public:
39 HrDepartment(char* name):Company(name){}
40 virtual void display(string str);
41
42 virtual void LineOfDuty(string company);
43 };
44
45 class FinanceDepartment:public Company{
46 public:
47 FinanceDepartment(char* name):Company(name){}
48 virtual void display(string str);
49
50 virtual void LineOfDuty(string company);
51 };
52
53
54 #endif
composite.cpp:
1 #include "composite.h"
2 #include <iostream>
3 using namespace std;
4
5 void ConcreteCompany::attach(Company* cpn)
6 {
7 if(nullptr != cpn)
8 {
9 mList.push_back(cpn);
10 }
11 }
12
13 void ConcreteCompany::detach(Company* cpn)
14 {
15 if(nullptr != cpn)
16 {
17 mList.remove(cpn);
18 }
19 }
20
21 void ConcreteCompany::display(string str)
22 {
23 list<Company* >::iterator beg = mList.begin();
24 cout<<str<<mName<<endl;
25 str = str + str;
26 for ( ; beg != mList.end(); beg++)
27 {
28 (*beg)->display(str);
29 }
30 }
31
32 void ConcreteCompany::LineOfDuty(string company)
33 {
34 list<Company* >::iterator beg = mList.begin();
35 string name = mName;
36 for ( ; beg != mList.end(); beg++)
37 {
38 (*beg)->LineOfDuty(name);
39 }
40 }
41
42 void HrDepartment::display(string str)
43 {
44 cout<<str<<mName<<endl;
45 }
46
47 void HrDepartment::LineOfDuty(string company)
48 {
49 cout<<company<<"员工招聘培训管理!"<<endl;
50 }
51
52 void FinanceDepartment::display(string str)
53 {
54 cout<<str<<mName<<endl;
55 }
56
57 void FinanceDepartment::LineOfDuty(string company)
58 {
59 cout<<company<<"公司财务收支管理!"<<endl;
60 }
main.cpp:
1 #include <iostream>
2 #include "composite.h"
3 using namespace std;
4
5 void main()
6 {
7 //
8 ConcreteCompany com1("木鸟飞公司");
9 FinanceDepartment com2("总公司财务部");
10 HrDepartment com3("总公司人力部");
11
12 com1.attach(&com2);
13 com1.attach(&com3);
14
15 ConcreteCompany com11("木鸟飞东北分公司");
16 FinanceDepartment com22("东北分公司财务部");
17 HrDepartment com33("东北分公司人力部");
18
19 com11.attach(&com22);
20 com11.attach(&com33);
21
22 com1.attach(&com11);
23
24 string str("─");
25 com1.display(str);
26
27 cout<<endl;
28
29 com1.LineOfDuty(str);
30 return;
31 }
原文链接: https://www.cnblogs.com/wrbxdj/p/5382605.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/231799
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!