组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性
这里使用公司总部和分公司来举例:
#ifndef COMPANY_H #define COMPANY_H #include <QString> #include <QDebug> #include <QList> class Company //公司类,抽象接口 { public: explicit Company(QString name):_name(name){} virtual void Add(Company *c) = 0; virtual void Remove(Company *c) = 0; virtual void Display(int depth) = 0; virtual void LineOfDuty() = 0; virtual ~Company() {} //注意析构函数不能声明为纯虚函数! protected: QString _name; }; class ConcreteCompany final: public Company //具体公司类,实现抽象接口 树枝节点 { public: explicit ConcreteCompany(QString name):Company(name){} ConcreteCompany(const ConcreteCompany &) = delete; //QList里面如果使用智能指针就不用delete了 ConcreteCompany & operator =(const ConcreteCompany &) = delete; //QList里面如果使用智能指针就不用delete了 void Add(Company *c) override { children.append(c); } void Remove(Company *c) override { children.removeOne(c); } void Display(int depth) override { qDebug()<<QString(depth,'-')<<_name; foreach (Company * c, children) { c->Display(depth+2); } } void LineOfDuty() override { foreach(Company *c , children) c->LineOfDuty(); } ~ConcreteCompany() override { qDeleteAll(children.begin(),children.end()); //QList里面如果使用智能指针就不用qDeleteAll了 children.clear(); } private: QList<Company *> children; }; class HRDepartment final: public Company //人力资源部类,树叶节点 { public: explicit HRDepartment(QString name):Company(name){} void Add(Company *) override {} void Remove(Company *) override {} void Display(int depth) override { qDebug()<<QString(depth,'-')<<_name; } void LineOfDuty() override { qDebug()<<_name<<"员工招聘培训管理"; } ~HRDepartment() override {} }; class FinanceDepartment final: public Company //人力资源部类,树叶节点 { public: explicit FinanceDepartment(QString name):Company(name){} void Add(Company *) override {} void Remove(Company *) override {} void Display(int depth) override { qDebug()<<QString(depth,'-')<<_name; } void LineOfDuty() override { qDebug()<<_name<<"公司财务收支管理"; } ~FinanceDepartment() override {} }; #endif // COMPANY_H有了树枝节点和树叶节点,就可以随意往里面添加内容啦,主函数可以这样举例:
#include "company.h" int main(int argc, char* argv[]) { Q_UNUSED(argc); Q_UNUSED(argv); ConcreteCompany root("北京总公司"); root.Add(new HRDepartment("总公司人力资源部")); root.Add(new FinanceDepartment("总公司财务部")); ConcreteCompany *comp = new ConcreteCompany("上海华东分公司"); comp->Add(new HRDepartment("华东分公司人力资源部")); comp->Add(new FinanceDepartment("华东分公司财务部")); root.Add(comp); ConcreteCompany *comp1 = new ConcreteCompany("南京办事处"); comp1->Add(new HRDepartment("南京办事处人力资源部")); comp1->Add(new FinanceDepartment("南京办事处公司财务部")); root.Add(comp1); ConcreteCompany *comp2 = new ConcreteCompany("杭州办事处"); comp2->Add(new HRDepartment("杭州办事处人力资源部")); comp2->Add(new FinanceDepartment("杭州办事处公司财务部")); root.Add(comp2); qDebug()<<"结构图:"; root.Display(1); qDebug()<<"职责:"; root.LineOfDuty(); return 0; }可以看出,只要组合模式的类构造好,往里面添加枝叶是非常容易的!并且使用里面的方法时可以把所有枝叶的方法都展现出来,非常好用!
最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/CompanyAndDepartment_Composite_pattern_19