前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >结构型之组合模式C++实现

结构型之组合模式C++实现

作者头像
用户9831583
发布2022-06-16 15:14:29
1830
发布2022-06-16 15:14:29
举报
文章被收录于专栏:码出名企路

需求分析:很多“部分-整体”的关系,例如:大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。

组合模式:一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。

优点:

  1. 使客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,简化了客户端代码;
  2. 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

缺点:

  1. 设计较复杂,客户端需要花更多时间理清类之间的层次关系;
  2. 不容易限制容器中的构件;
  3. 不容易用继承的方法来增加构件的新功能;

主要角色:

  1. 抽象构件(Component)角色:为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。
  2. 树叶构件(Leaf)角色:组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。
  3. 树枝构件(Composite)角色:组合中的分支节点对象,它有子节点。实现了抽象构件角色中声明的接口,主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

具体案例:

小码路所在的北京总公司,内部分为人力资源和财务部,在华东开了一家分公司,并分别在杭州和南京有办事处,总公司要求下码路实现全部架构。

第一步:抽象构件角色

代码语言:javascript
复制
#pragma once
#include <iostream>
using namespace std;
#include <list>

//抽象构件角色
class Company
{
    public:
        Company(string name)
        {
            this->name=name;
        }
        virtual void add(Company *company)=0;
        virtual void display(int d)=0;
        virtual void duty()=0;
    public:
        string name;
};

第二步:树叶构件角色

代码语言:javascript
复制
//具体构件角色
class ConCompany:public Company
{
    private:
        list<Company*>  comList;
    public:
        ConCompany(string name):Company(name){}

        void add(Company *company)override
        {  
        
            comList.push_back(company);
        }

        void display(int d)override
        {
            //输出树型结构
            for(int i=0;i<d;i++)
            {
                cout<<"-";
            }
            cout<<name<<endl;

            //向下遍历
            for (list<Company*>::iterator it = comList.begin();
                            it != comList.end(); ++it)
                {
                    (*it)->display(d+1);
                }
          
        }

        void duty()override
        {    
            
             for (list<Company*>::iterator it = comList.begin();
                        it != comList.end(); ++it)
             {
                 (*it)->duty();
             }
        }

};

第三步:树枝构件角色

代码语言:javascript
复制
//树枝构件角色
//人力资源部
class HRDepartment:public Company
 {
  
    public:
        HRDepartment(string name):Company(name)
        {
        
        }

        void add(Company *company)override 
        {
            
        }
    
        void display(int d)override  
        {
            //输出树形结构的子节点
            for(int i=0; i<d; i++)
            {
                cout<<"-";
            }
            cout<<name<<endl;
        }

    void duty()override 
        {
            cout<<name << ":员工招聘培训管理"<<endl;
        }
        
};

//财务部
class  FinanceDepartment:public Company
 {

    public:
        FinanceDepartment(string name):Company(name)
        {
          
        }
        
        void add(Company *company)override 
        {
            
        }
        
        void display(int d)override  
        {
            //输出树形结构的子节点
            for(int i=0; i<d; i++)
            {
                cout<<"-";
            }
            cout<<name<<endl;
        }

    void duty()override 
        {
            cout<<name << ":员工招聘培训管理"<<endl;
        }
    
};

第四步:客户端

代码语言:javascript
复制
#include "c.h"

int main()
{
         //总公司
          Company *root = new ConCompany("北京总公司");
          root->add(new HRDepartment("总公司人力资源部"));
          root->add(new FinanceDepartment("总公司财务部"));
          
          //分公司
         Company *company = new ConCompany("上海华东分公司");
         company->add(new HRDepartment("华东分公司人力资源部"));
         company->add(new FinanceDepartment("华东分公司财务部"));
         root->add(company);
        
         //办事处
         Company *company1 = new ConCompany("南京办事处");
         company1->add(new HRDepartment("南京办事处人力资源部"));
         company1->add(new FinanceDepartment("南京办事处财务部"));
         company->add(company1);
        
         Company *company2 = new ConCompany("杭州办事处");
         company2->add(new HRDepartment("杭州办事处人力资源部"));
        company2->add(new FinanceDepartment("杭州办事处财务部"));
         company->add(company2);
        
         cout<<"结构图:"<<endl;
         root->display(1);
        
         cout<<"职责:"<<endl;
         root->duty();
}

结果显示:


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出名企路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档