设计模式-组合模式

组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

比如:一个公司,它有一个总公司,下面还有许多子公司。每个公司都有自己的财务部、人力资源部等。对于总公司来说,不论是子公司,还是财务部、人力资源部,都是它的部门。整个公司的部门拓扑图就是一个树形结构。
UML:
这里写图片描述

//抽象公司类
class Company {
protected:
    string m_name;
public:
    Company(string name):m_name(name){}
    virtual ~Company(){}
    virtual void Add(Company *company) {}
    virtual void Diaplay(int depth) {}
};
//具体公司类
class ConcreteCompany :public Company {
private:
    list<Company *> m_list;
public:
    ConcreteCompany(string name):Company(name){}
    virtual ~ConcreteCompany() {}
    void Add(Company *company)
    {
        m_list.push_back(company);
    }
    void Diaplay(int depth)
    {
        for (int i = 0; i < depth; i++)
            cout << "-";
        cout << m_name << endl;
        for (auto l : m_list)        //显示结点  
            l->Diaplay(depth + 2);
    }
};
//人力资源部门
class HRDepartment :public Company
{
public:
    HRDepartment(string name) :Company(name) {}
    virtual ~HRDepartment() {}
    void Diaplay(int depth)      //叶节点,没有添加函数  
    {
        for (int i = 0; i < depth; i++)
            cout << "-";
        cout << m_name << endl;
    }
};
//财务部门
class FinanceDepartment : public Company
{
public:
    FinanceDepartment(string name) :Company(name) {}
    virtual ~FinanceDepartment() {}
    void Diaplay(int depth) 
    {
        for (int i = 0; i < depth; i++)
            cout << "-";
        cout << m_name << endl;
    }
};
int main()
{
    Company *root = new ConcreteCompany("总公司");
    Company *leaf1 = new FinanceDepartment("财务部");
    Company *leaf2 = new HRDepartment("人力资源部");
    root->Add(leaf1);
    root->Add(leaf2);

    Company *mid1 = new ConcreteCompany("分公司A");
    Company *leaf3 = new FinanceDepartment("A财务部");
    Company *leaf4 = new HRDepartment("A人力资源部");
    mid1->Add(leaf3);
    mid1->Add(leaf4);
    root->Add(mid1);

    Company *mid2 = new ConcreteCompany("分公司B");
    FinanceDepartment *leaf5 = new FinanceDepartment("B财务部");
    HRDepartment *leaf6 = new HRDepartment("B人力资源部");
    mid2->Add(leaf5);
    mid2->Add(leaf6);
    root->Add(mid2);
    root->Diaplay(1);
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值