//设计模式之组合模式
/*组合模式将对象组合成树形结构表示部分整体的层次结构,使得用户对单个对象和组合
对象的使用具有一致性
透明方式和安全方式,在component中声明用来管理子对象的方法,这样实现的所有
component接口的所有子类都具备父类具有的功能,具有完全一致的行为接口。
安全方式在接口中不声明remove和add的方法,子类也就不需要实现它,在component
中声明所有用来管理子类对象的方法,由于不透明行,树中不具备相同的接口,客户端调用
需要作出判断。
什么时候使用组合模式?
需求中体现部分与总体的结构层次,希望用户可以忽略组合对象与单个对象的不同,统一
使用组合结构中所有对象,考虑使用组合模式*/
#include<iostream>
#include<string>
#include<list>
using namespace std;
class Company
{
string m_name;
public:
Company(string name) :m_name(name) {};
string getname() { return m_name; }
virtual void Add(Company* c) = 0;
virtual void Remove(Company* c) = 0;
virtual void Display(int dapth) = 0;
virtual void LineOfDuty() = 0;
};
class RealCompany :public Company
{
list<Company*> link;
list<Company*>::iterator it;
public:
RealCompany(string name) :Company(name) {};
void Add(Company* c)
{
link.push_back(c);
}
void Remove(Company* c)
{
link.remove(c);
}
void Display(int dapth)
{
cout << "-" << this->getname() << endl;
for (it = link.begin(); it != link.end(); it++)
{
for (int i = 0; i < dapth; i++)
cout << "-";
(*it)->Display(dapth);
}
}
void LineOfDuty()
{
for (it = link.begin(); it != link.end(); it++)
{
(*it)->LineOfDuty();
}
}
};
class HRDepartmemt :public Company
{
public:
HRDepartmemt(string name) :Company(name) {};
void Add(Company* c)
{
return;
}
void Remove(Company* c)
{
return;
}
void Display(int dapth)
{
cout << this->getname() << endl;
}
void LineOfDuty()
{
cout << this->getname() << "员工招聘培训管理" << endl;
}
};
class FinDepartmemt :public Company
{
public:
FinDepartmemt(string name) :Company(name) {};
void Add(Company* c)
{
return;
}
void Remove(Company* c)
{
return;
}
void Display(int dapth)
{
cout << this->getname() << endl;
}
void LineOfDuty()
{
cout << this->getname() << "公司财务收支管理" << endl;
}
};
int main()
{
RealCompany* root = new RealCompany("北京总公司");
root->Add(new HRDepartmemt("总公司人力资源部"));
root->Add(new FinDepartmemt("总公司财务部"));
RealCompany* shanghai = new RealCompany("上海分公司");
shanghai->Add(new HRDepartmemt("华东分公司人力资源部"));
shanghai->Add(new FinDepartmemt("华东分公司财务部"));
root->Add(shanghai);
RealCompany * nanjing = new RealCompany("南京办事处");
nanjing->Add(new HRDepartmemt("南京办事处人力资源部"));
nanjing->Add(new FinDepartmemt("南京办事处财务处"));
root->Add(nanjing);
cout << "\n结构图" << endl;
root->Display(1);
cout << "\n职责" << endl;
root->LineOfDuty();
root->Remove(nanjing);
cout << "\n结构图" << endl;
root->Display(1);
cout << "\n职责" << endl;
root->LineOfDuty();
system("pause");
return 0;
}
运行结果为
结构图
-北京总公司
-总公司人力资源部
-总公司财务部
--上海分公司
-华东分公司人力资源部
-华东分公司财务部
--南京办事处
-南京办事处人力资源部
-南京办事处财务处
职责
总公司人力资源部员工招聘培训管理
总公司财务部公司财务收支管理
华东分公司人力资源部员工招聘培训管理
华东分公司财务部公司财务收支管理
南京办事处人力资源部员工招聘培训管理
南京办事处财务处公司财务收支管理
结构图
-北京总公司
-总公司人力资源部
-总公司财务部
--上海分公司
-华东分公司人力资源部
-华东分公司财务部
职责
总公司人力资源部员工招聘培训管理
总公司财务部公司财务收支管理
华东分公司人力资源部员工招聘培训管理
华东分公司财务部公司财务收支管理
请按任意键继续. . .
看的懂得同学们已经看出了该种设计模式的便利之处在于两个Add和remove两个空方法声明,return不返回任何东西,可以添加删除公司的类和它的子类管理节点。很好的一个机制。