设计模式---组合模式

来源:互联网 发布:驱动器加密软件 编辑:程序博客网 时间:2024/06/07 08:55

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


#include<iostream>

#include<list>

using namespace std;


class Company
{
    protected:
        string m_name;
    public:
        Company(string name):m_name(name){}
    
        virtual void add(Company c){}
        virtual void show(int depth){}
};

class ConcreteCompany: public Company
{
    private:
        list<Company*> child;
    public:
         ConcreteCompany(string name):Company(name){}
        
         void add(Company* c)
        {
            child.push_back(c);
        }

        void show(int depth)
        {
            for(int i = 0;i < depth; i++)
                cout<<"-";
            cout<<m_name<<endl;
            
            list<Company*>::iterator iter = child.begin();
            for(;iter!= child.end();iter++)
                (*iter)->show(depth+2);
        }
};

class HRDepartment:public Company
{
    public:
        HRDepartment(string name):Company(name){}
        void add(Company*c){}
        
        void show(int depth )
        {
            for(int i = 0;i<depth;i++)
                cout<<"-";
            cout<<m_name<<endl;
        }
};

class FinanceDepart:public Company
{
    public:
        FinanceDepart(string name):Company(name){}
        void add(Company*c){}
        
        void show(int depth )
        {
            for(int i = 0;i<depth;i++)
                cout<<"-";
            cout<<m_name<<endl;
        }
};


int main()
{
    ConcreteCompany *root = new ConcreteCompany("root");
    root->add(new HRDepartment("root hr"));
    root->add(new FinanceDepart("root finance"));

    ConcreteCompany *ch1 = new ConcreteCompany("child 11");
    ch1->add(new HRDepartment("child 11  hr"));
    ch1->add(new FinanceDepart("child 11 finance"));
    root->add(ch1);
    
    ConcreteCompany *ch2 = new ConcreteCompany("child 22");
    ch2->add(new HRDepartment("child 22  hr"));
    ch2->add(new FinanceDepart("child 22 finance"));
    root->add(ch2);

    ConcreteCompany *ch3 = new ConcreteCompany("child 33");
    ch3->add(new HRDepartment("child 33  hr"));
    ch3->add(new FinanceDepart("child 33 finance"));
    
    ConcreteCompany *ch4= new ConcreteCompany("child 44");
    ch4->add(new HRDepartment("child 44  hr"));
    ch4->add(new FinanceDepart("child 44 finance"));
    ch3->add(ch4);
    root->add(ch3);
    
    root->show(0);

    return 0;
}


原创粉丝点击