组合模式(Composite Pattern)是部分-整体模式的一种特例,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
类图:

这里写图片描述

适用性  以下情况下适用Composite模式:  1.你想表示对象的部分-整体层次结构  2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

代码示例:

#include <iostream>
#include <list>
#include <string>
using namespace std;
class Company
{
public:
    Company(string name):m_name(name)
    {
    }
    virtual ~Company(){}
    virtual void Add(Company *pCom){}
    virtual void Remove(Company *pCom){}
    virtual void Operation() { }
protected:
    string m_name;
};
class CompanyA:public Company
{
public:
    CompanyA(string name):Company(name)
    {
    }
    virtual void Add(Company *pCom){m_listCompany.push_back(pCom);}
    virtual void Remove(Company *pCom){m_listCompany.remove(pCom);}
    virtual void Operation()
    {
        cout<<"name:"<<m_name<<endl;
        for(list<Company *>::iterator iter=m_listCompany.begin();iter !=m_listCompany.end();iter++)
        {
            (*iter)->Operation();
        }
    }
private:
    list<Company *> m_listCompany;
};
class HRDepartment:public Company
{
public:
    HRDepartment(string name):Company(name)
    {
    }
    void Operation()
    {
        cout<<"name:"<<m_name<<endl;
    }
};

int main(void)
{
    Company *root = new CompanyA("TotalComany");
    Company *leaf1=new HRDepartment("TotalComanyHR");
    root->Add(leaf1);

    Company *mid1 = new CompanyA("ConcreteCompanyA");
    Company *leaf2=new HRDepartment("ConcreteCompanyAHR");
    mid1->Add(leaf2);

    root->Add(mid1);

    root->Operation();
    return 0;
}

运行结果:
这里写图片描述

文章为原创,转载请表明出处:http://blog.csdn.net/renyican

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐