设计模式学习笔记(C++实现)(九)--组合模式

1.组合模式简介

  • 英文名称
    Composite
  • 主要目的
    该模式将对象组合成树形结构已表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
  • 使用场景
    1.当你想表示对象的部分-整体层次结构时;
    2.你希望用户忽略组合对象与单个对象的不同时,用户将统一地使用组合结构中的所有对象。

2.组合模式代码示例

  • 测试平台
    1.开发语言:C++
    2.开发工具:VS2015
    3.操作系统:Win7 X64
  • 代码说明
    本例用组合实现如下图所示的公司架构图。
    这里写图片描述
    1.Company–抽象公司类,该类提供具体的抽象接口;
    2.CompositeCompany–具体部门类,该类表示那些可以包含子部门的部门;
    3.ConcreateCompony–具体部门类,该类不包含子部门,为公司的最小组成单位。

    注意:
    1.本例以组合模式来展示本人所在公司的公司架构图。

  • 具体代码

#include <iostream>
#include <string>
#include <list>
using namespace std;

//抽象公司类
class Company
{
public:
    Company(string name):
        m_Name(name)
    {
    }

    virtual void Add(Company* com) = 0;      //增加部门
    virtual void Remove(Company* com) = 0;   //移除部门
    virtual void Display() = 0;              //显示部门结构
protected:
    string m_Name;                           //名称
};

//含有子部们的公司部门类
class CompositeCompany :public Company
{
public:
    CompositeCompany(string name):Company(name)
    {}

    void Add(Company* com)
    {
        this->m_ComList.push_back(com);
    }

    void Remove(Company* com)
    {
        this->m_ComList.remove(com);
    }

    void Display()
    {
        cout << this->m_Name << endl;
        for each (Company* com in this->m_ComList)
        {
            cout << "****";
            com->Display();
        }
    }
private:
    list<Company*> m_ComList;                 //子部门类别
};


//不含子部们的最小部门类
class ConcreateCompony :public Company
{
public:
    ConcreateCompony(string name) :Company(name)
    {}

    void Add(Company* com)
    {
        return;
    }

    void Remove(Company* com)
    {
        return;
    }

    void Display()
    {
        cout << "****"<<this->m_Name << endl;
    }
};

int main()
{
    //建立总公司
    CompositeCompany* pHeadCompony = new CompositeCompany("某公司");

    //添加行政部
    CompositeCompany* pComp1 = new CompositeCompany("行政部");
    pHeadCompony->Add(pComp1);

    //添加财务部
    CompositeCompany* pComp2 = new CompositeCompany("财务部");
    pHeadCompony->Add(pComp2);

    //添加研发部
    CompositeCompany* pComp3 = new CompositeCompany("研发部");
    pHeadCompony->Add(pComp3);

    //添加硬件组
    ConcreateCompony* pConcreate1 = new ConcreateCompony("硬件组");
    pComp3->Add(pConcreate1);

    //添加软件组
    ConcreateCompony* pConcreate2 = new ConcreateCompony("软件组");
    pComp3->Add(pConcreate2);

    //添加算法组
    ConcreateCompony* pConcreate3 = new ConcreateCompony("算法组");
    pComp3->Add(pConcreate3);

    //显示公司结构
    pHeadCompony->Display();

    delete pHeadCompony;
    pHeadCompony = NULL;

    delete pComp1;
    pComp1 = NULL;

    delete pComp2;
    pComp2 = NULL;

    delete pComp3;
    pComp3 = NULL;

    delete pConcreate1;
    pConcreate1 = NULL;

    delete pConcreate2;
    pConcreate2 = NULL;

    delete pConcreate3;
    pConcreate3 = NULL;
    getchar();
    return 0;
}
  • 输出结果
    这里写图片描述

栏目导航
上一篇:设计模式学习笔记(C++实现)(八)–桥接模式
下一篇:设计模式学习笔记(C++实现)(十)–装饰模式

参考文献:
1.《设计模式:可复用面向对象软件的基础》

猜你喜欢

转载自blog.csdn.net/u014337397/article/details/80414207