• 组合模式(composite)C++实现


    组合模式

    意图:

           将对象组合成树形结构以表示‘部分-整体’的层次结构,所以有时候又叫做部分-整体模式。组合模式使得用户对单个对象和组合对象的使用具有一致性。,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

    适用性:

           当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时。

    优点:

           组合模式使得基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。

           组合模式让客户可以一致的使用组合结构和单个对象。

    UML:

    抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。在安全式的合成模式里,构件角色并不是定义出管理子对象的方法,这一定义由树枝构件对象给出。

    树叶构件(Leaf)角色:树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。

    树枝构件(Composite)角色:代表参加组合的有下级子对象的对象。树枝对象给出所有的管理子对象的方法,如add()、remove()、getChild()等。

    代码实现:输出对应公司结构和其部门职责,这里总公司、分公司、各种部门都有共同的接口

    composite.h实现:

     1 #ifndef COMPOSITE_H
     2 #define COMPOSITE_H
     3 
     4 #include <list>
     5 using std::list;
     6 
     7 #include <string>
     8 using std::string;
     9 
    10 #include <iostream>
    11 using namespace std;
    12 
    13 class Company
    14 {
    15 public:
    16     Company(char* name):mName(name){}
    17     virtual void attach(Company* cpn){}
    18     virtual void detach(Company* cpn){}
    19     virtual void display(string str){}
    20     
    21     virtual void LineOfDuty(string company){}
    22 
    23 protected:
    24     char* mName;
    25     list<Company* > mList;
    26 };
    27 
    28 class ConcreteCompany:public Company{
    29 public:
    30     ConcreteCompany(char* name):Company(name){}
    31     virtual void attach(Company* cpn);
    32     virtual void detach(Company* cpn);
    33     virtual void display(string str);
    34     virtual void LineOfDuty(string company);
    35 };
    36 
    37 class HrDepartment:public Company{
    38 public:
    39     HrDepartment(char* name):Company(name){}
    40     virtual void display(string str);
    41 
    42     virtual void LineOfDuty(string company);
    43 };
    44 
    45 class FinanceDepartment:public Company{
    46 public:
    47     FinanceDepartment(char* name):Company(name){}
    48     virtual void display(string str);
    49 
    50     virtual void LineOfDuty(string company);
    51 };
    52 
    53 
    54 #endif

    composite.cpp:

     1 #include "composite.h"
     2 #include <iostream>
     3 using namespace std;
     4 
     5 void ConcreteCompany::attach(Company* cpn)
     6 {
     7     if(nullptr != cpn)
     8     {
     9         mList.push_back(cpn);
    10     }
    11 }
    12 
    13 void ConcreteCompany::detach(Company* cpn)
    14 {
    15     if(nullptr != cpn)
    16     {
    17         mList.remove(cpn);
    18     }
    19 }
    20 
    21 void ConcreteCompany::display(string str)
    22 {
    23     list<Company* >::iterator beg = mList.begin();
    24     cout<<str<<mName<<endl;
    25     str = str + str;
    26     for ( ; beg != mList.end(); beg++)
    27     {
    28         (*beg)->display(str);
    29     }
    30 }
    31 
    32 void ConcreteCompany::LineOfDuty(string company)
    33 {
    34     list<Company* >::iterator beg = mList.begin();
    35     string name = mName;
    36     for ( ; beg != mList.end(); beg++)
    37     {
    38         (*beg)->LineOfDuty(name);
    39     }
    40 }
    41 
    42 void HrDepartment::display(string str)
    43 {
    44     cout<<str<<mName<<endl;
    45 }
    46 
    47 void HrDepartment::LineOfDuty(string company)
    48 {
    49     cout<<company<<"员工招聘培训管理!"<<endl;
    50 }
    51 
    52 void FinanceDepartment::display(string str)
    53 {
    54     cout<<str<<mName<<endl;
    55 }
    56 
    57 void FinanceDepartment::LineOfDuty(string company)
    58 {
    59     cout<<company<<"公司财务收支管理!"<<endl;
    60 }

    main.cpp:

     1 #include <iostream>
     2 #include "composite.h"
     3 using namespace std;
     4 
     5 void main()
     6 {
     7     //
     8     ConcreteCompany com1("木鸟飞公司");
     9     FinanceDepartment com2("总公司财务部");
    10     HrDepartment com3("总公司人力部");
    11 
    12     com1.attach(&com2);
    13     com1.attach(&com3);
    14 
    15     ConcreteCompany com11("木鸟飞东北分公司");
    16     FinanceDepartment com22("东北分公司财务部");
    17     HrDepartment com33("东北分公司人力部");
    18 
    19     com11.attach(&com22);
    20     com11.attach(&com33);
    21 
    22     com1.attach(&com11);
    23 
    24     string str("");
    25     com1.display(str);
    26         
    27     cout<<endl;
    28 
    29     com1.LineOfDuty(str);
    30     return;
    31 }
  • 相关阅读:
    Java过滤器与SpringMVC拦截器之间的关系与区别
    Linux分区,并且把新的分区挂载到指定的文件夹
    HibernateTemplate和HibernateDaoSupport(spring注入问题)
    EJB到底是什么,真的那么神秘吗??
    Hibernate关联关系配置(一对多、一对一和多对多)
    Druid的使用步骤
    Spring MVC静态资源处理(在applicationContex.xml文件中进行配置)
    Spring <context:annotation-config/> 解说
    hibernate的五大接口
    oracle11g数据库的安装以及安装之后的配置
  • 原文地址:https://www.cnblogs.com/wrbxdj/p/5382605.html
Copyright © 2020-2023  润新知