组合模式(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; }