12.组合模式

来源:互联网 发布:经典句子 知乎 编辑:程序博客网 时间:2024/06/17 00:01

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;}
0 0
原创粉丝点击