组合模式
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
应用情景:
1、您想表示对象的部分-整体层次结构(树形结构)。
2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
比如一个集团公司,它有一个母公司,下设很多家子公司。不管是母公司还是子公司,都有各自直属的财务部、人力资源部、销售部等。对于母公司来说,不论是子公司,还是直属的财务部、人力资源部,都是它的部门。整个公司的部门拓扑图就是一个树形结构。
#ifndef _COMPOSITE_H_
#define _COMPOSITE_H_
#include<iostream>
#include<vector>
using namespace std;
//抽象公司
class XCompany
{
public:
XCompany(string sName):companyName(sName) {}
virtual void add(XCompany*) {};
virtual void remove() {};
virtual void show(int depth) = 0;
protected:
string companyName;
};
//具体的公司
class Company : public XCompany
{
public:
Company(string sName):XCompany(sName) {}
void add(XCompany *company) override
{
companys.push_back(company);
}
void remove() override
{
companys.front();
}
void show(int depth) override
{
for(int i=0; i<depth; ++i)
cout<<"-";
cout<< companyName << endl;
for(vector<XCompany*>::const_iterator it = companys.begin(); it != companys.end(); ++it)
(*it)->show(depth+2);
}
private:
vector<XCompany*> companys;
};
//人事部
class HRdepartment : public XCompany
{
public:
HRdepartment(string sName):XCompany(sName) {}
void show(int depth) override
{
for(int i=0; i<depth; ++i)
cout<< "-";
cout<< companyName << endl;
}
};
//财务部
class FinanceDepartment : public XCompany
{
public:
FinanceDepartment(string sName):XCompany(sName) {}
void show(int depth) override
{
for(int i=0; i<depth; ++i)
cout << "-";
cout<< companyName << endl;
}
};
#endif
int main()
{
XCompany *root = new Company("上海总公司");
XCompany *root_HR = new HRdepartment("上海总公司人事部");
XCompany *root_Finance = new FinanceDepartment("上海总公司财务部");
root->add(root_HR);
root->add(root_Finance);
XCompany *subCompany = new Company("南京分公司");
XCompany *subCompany_HR = new HRdepartment("南京分公司人事部");
XCompany *subCompany_Finance = new FinanceDepartment("南京分公司财务部");
subCompany->add(subCompany_HR);
subCompany->add(subCompany_Finance);
root->add(subCompany);
root->show(0);
return 0;
}