12.组合模式

1.说明
请参见本文第一章
2.组合模式说明
组合模式:将对象组合成树形接口以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象具有一致性。
为了保持整体和局部的一致性,整体和局部具有相同的接口,从而避免判断该节点是整体还是局部。接口可以实现为空。
使用范围:在需求中体现部分与整体的层次的接口时,以及你希望用户忽略组合对象与单个对象的不同,同一地使用组合接口中的所有对象时,可以考虑使用组合模式
注意:为了表示在树形中的深度时,会在调用中加入步进,以表示在嵌套的处理过程中的节点深度
3.UML
这里写图片描述
4.代码

//公司基类
 #ifndef __COMPANY_H
#define __COMPANY_H

#include <iostream>
#include <string>

class CCompany
{
public:
    CCompany(std::string name)
    {
        m_name = name;
    }
    std::string getname()
    {
        return m_name;
    }
    virtual void add(CCompany* com) 
    {       
    }
    virtual void remove(CCompany* com)
    {       
    }
    virtual void display(int step) = 0;

    virtual void responsibility(int step) = 0; 

private:
    std::string m_name;
};

#endif
//财政
#ifndef __FINACIAL_H
#define __FINACIAL_H

#include "Company.h"

class CFinacia:public CCompany
{
public:
    CFinacia(std::string name):CCompany(name){}
    ~CFinacia(){} 

    virtual void display(int step)
    {
        std::string format;
        for (int i=0; i<step; i++)
            format += "--";
        std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl;  
    }   
    virtual void responsibility(int step)
    {
        std::string format;
        for (int i=0; i<step; i++)
            format += "--";
        std::cout<<format.c_str()<<getname().c_str()<<":"<<m_responsibility.c_str()<<std::endl;
    }   
private:
    std::string m_responsibility;
};

#endif

//人事
#ifndef __MANPOWER_H
#define __MANPOWER_H

#include "Company.h"

class CManPower:public CCompany
{
public:
    CManPower(std::string name):CCompany(name)
    {}
    ~CManPower(){}

    virtual void display(int step)  
    {
        std::string format;
        for (int i=0; i<step; i++)
            format += "--";
        std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl;           
    }   
    virtual void responsibility(int step) 
    {
        std::string format;
        for (int i=0; i<step; i++)
            format += "--";

        std::cout<<format.c_str()<<getname().c_str()<<":"<<m_responsibility.c_str()<<std::endl;
    }   
    void set_responsibility(std::string bility)
    {
        m_responsibility = bility;
    }   
private:
    std::string m_responsibility;
};

#endif
//具体公司
#ifndef __REALCOMPANY_H
#define __REALCOMPANY_H

#include <list>
#include "Company.h"

typedef std::list<CCompany*> COMPANLYLIST;

class CRealCompany:public CCompany
{
public:
    CRealCompany(std::string name):CCompany(name){} 
    virtual void add(CCompany* com) 
    {   
        m_conlist.push_back(com);
    }
    virtual void remove(CCompany* com)
    {       
        for (COMPANLYLIST::iterator it=m_conlist.begin(); it!=m_conlist.end(); )
        {
            if ((*it)->getname() == com->getname())
            {
                delete *it;
                m_conlist.erase(it);
            }
            else
                it++;
        }
    }
    void display(int step)
    {
        std::string format = "";        
        for (int i=0; i<step; i++)
            format += "--";         
        std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl;      
        for (COMPANLYLIST::iterator it=m_conlist.begin(); it != m_conlist.end(); it++)
        {
            (*it)->display(step+1); 
        }       
    }
    void responsibility(int step)
    {
        std::string format = "";        
        for (int i=0; i<step; i++)
            format += "--";         
        std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl;          
        std::cout<<format.c_str()<<m_responsibility.c_str()<<std::endl;
        for (COMPANLYLIST::iterator it=m_conlist.begin(); it != m_conlist.end(); it++)
        {
            (*it)->responsibility(step+1);
        }       
    }
    void set_responsibility(std::string bility)
    {
        m_responsibility = bility;
    }
private:
    std::string m_responsibility;

    COMPANLYLIST m_conlist;
};

#endif

//client调用

#include <iostream>

#include "Company.h"
#include "RealCompany.h"
#include "ManPower.h"
#include "Finacia.h"

int main(void)
{
    CCompany* root = new CRealCompany("root");
    CCompany* son1 = new CRealCompany("son1");
    CCompany* son2 = new CRealCompany("son2");
    CCompany* son3 = new CRealCompany("son3");
    CCompany* son4 = new CRealCompany("son4");  

    root->add(son1);
    root->add(son2);
    root->add(son3);
    root->add(son4);

    root->display(0);

    std::cout<<"===================================================="<<std::endl;
    CCompany* son1_p1 = new CManPower("son1_p1");
    CCompany* son1_p2 = new CManPower("son1_p2");
    CCompany* son1_p3 = new CManPower("son1_p3");
    CCompany* son2_p1 = new CManPower("son2_p1");
    CCompany* son2_p2 = new CManPower("son2_p2");

    son1->add(son1_p1);
    son1->add(son1_p2);
    son1->add(son1_p3);

    son2->add(son2_p1);
    son2->add(son2_p2); 

    CCompany* son1_f1 = new CFinacia("son1_f1");
    CCompany* son1_f2 = new CFinacia("son1_f2");
    CCompany* son1_f3 = new CFinacia("son1_f3");
    CCompany* son2_f1 = new CFinacia("son2_f1");
    CCompany* son2_f2 = new CFinacia("son2_f2");
    CCompany* son2_f3 = new CFinacia("son2_f3");
    CCompany* son2_f4 = new CFinacia("son2_f4");

    son1->add(son1_f1);
    son1->add(son1_f2);
    son1->add(son1_f3);

    son2->add(son2_f1);
    son2->add(son2_f2);
    son2->add(son2_f3);
    son2->add(son2_f4);

    CCompany* child21 = new CRealCompany("child21");
    CCompany* child211 = new CRealCompany("child211");
    CCompany* child212 = new CRealCompany("child212");
    CCompany* child2121 = new CRealCompany("child2121");

    son2->add(child21);
    child21->add(child211);
    child211->add(child212);
    child212->add(child2121);

    child2121->add(son1_f1);
    child2121->add(son1_p1);

    root->display(0);
    std::cout<<"===================================================="<<std::endl;


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值