设计模式_组合模式

组合模式

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


猜你喜欢

转载自blog.csdn.net/qq_31175231/article/details/71173457
今日推荐