组合

将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性.

实例

main.cc:

#include <windows.h>
#include "shop_saler.h"
#include "shop_keeper.h"
#include <iostream>
using namespace std;/*
design_pattern:"compositor"总 店 长(A)/    |    \B    C     D/     \E       F/ \ G   H
A:深圳总店长(熊总)
B:总店店员(李一)
C:总店店员(王二)
D:宝安区店长(张三)
E:宝安区店员(李四)
F:宝安区西乡街道店长(刘五)
G:西乡街道店员(陈六)
H:西乡街道店员(方七)
*/
int main(){Employee *shop_keeper_A = new ShopKeeper("深圳总店长(熊总)",40,10000);Employee *shop_saler_B = new ShopSaler("总店店员(李一)",18,6000);Employee *shop_saler_C = new ShopSaler("总店店员(王二)",19,5500);Employee *shop_keeper_D = new ShopKeeper("宝安区店长(张三)",35,8000);Employee *shop_saler_E = new ShopSaler("宝安区店员(李四)",20,5000);Employee *shop_keeper_F = new ShopKeeper("宝安区西乡街道店长(刘五)",33,7000);Employee *shop_saler_G = new ShopSaler("西乡街道店员(陈六)",21,4500);Employee *shop_saler_H = new ShopSaler("西乡街道店员(方七)",22,4000);//From bottom to topshop_keeper_F->Add(shop_saler_G);shop_keeper_F->Add(shop_saler_H);shop_keeper_D->Add(shop_saler_E);shop_keeper_D->Add(shop_keeper_F);shop_keeper_A->Add(shop_saler_B);shop_keeper_A->Add(shop_saler_C);shop_keeper_A->Add(shop_keeper_D);shop_keeper_A->ShowInformation();//cleardelete shop_keeper_A;delete shop_saler_B;delete shop_saler_C;delete shop_keeper_D;delete shop_saler_E;delete shop_keeper_F;delete shop_saler_G;delete shop_saler_H;system("Pause");return 0;
}

Employee:

//employee.h
#ifndef HELENDP_SOURCE_EMPLOYEE_H_
#define HELENDP_SOURCE_EMPLOYEE_H_
#include <string>
using namespace std;class Employee{
public:Employee(string name,int age,int salary);virtual ~Employee();string GetName();virtual void Add(Employee *employee);int GetAge();int GetSalary();virtual void ShowInformation();
private:string name_;int age_;int salary_;
};
#endif//employee.cc
#include "employee.h"
#include <iostream>
using namespace std;Employee::Employee(string name,int age,int salary){name_ = name;age_ = age;salary_ = salary;
}Employee::~Employee(){}void Employee::Add(Employee * employee){cout << "Employee::Add: will not run here" << endl;
}void Employee::ShowInformation(){cout << "Employee::ShowInformation: will not run here" << endl;
}
string Employee::GetName(){return name_;
}int Employee::GetAge(){return age_;
}int Employee::GetSalary(){return salary_;
}

ShopSaler:

//shop_saler.h
#ifndef HELENDP_SOURCE_SHOP_SALER_H_
#define HELENDP_SOURCE_SHOP_SALER_H_
#include "employee.h"class ShopSaler : public Employee{
public:ShopSaler(string name,int age,int salary);~ShopSaler();void Add(Employee *employee);void ShowInformation();
};
#endif//shop_saler.cc
#include "shop_saler.h"
#include <iostream>
using namespace std;ShopSaler::ShopSaler(string name,int age,int salary):Employee(name,age,salary){}ShopSaler::~ShopSaler(){}void ShopSaler::Add(Employee *employee){cout << "ShopSaler::Add: will not run here" << endl;
}void ShopSaler::ShowInformation(){cout << this->GetName() << "," << this->GetAge() << "," << this->GetSalary() << endl;
}

ShopKeeper:

//shop_keeper.h
#ifndef HELENDP_SOURCE_SHOP_KEEPER_H_
#define HELENDP_SOURCE_SHOP_KEEPER_H_
#include "employee.h"
#include <list>
using namespace std;class ShopKeeper : public Employee{
public:ShopKeeper(string name,int age,int salary);~ShopKeeper();void Add(Employee *employee);void ShowInformation();
private:list<Employee *> list_employee_;
};
#endif//shop_keeper.cc
#include "shop_keeper.h"
#include <iostream>
using namespace std;ShopKeeper::ShopKeeper(string name,int age,int salary) : Employee(name,age,salary){
}ShopKeeper::~ShopKeeper(){}void ShopKeeper::Add(Employee *employee){list_employee_.push_back(employee);
}void ShopKeeper::ShowInformation(){cout << this->GetName() << "," << this->GetAge() << "," << this->GetSalary() << endl;for(list<Employee *>::iterator v = list_employee_.begin();v != list_employee_.end();v++){(*v)->ShowInformation();}
}

代码和UML图(EA)工程文件,最后会整理打包上传.

UML类图

结构

  • Component(Employee):组合对象的抽象.
  • Leaf(ShopSaler):组合对象节点.
  • Composite(ShopKeeper):含有组合对象的节点对象.

优点

  • 定义了包含基本对象和组合对象的类层次结构.
  • 简化客户代码.
  • 使得更容易增加新类型的组件.
  • 使你的设计变得更加一般化.

缺点

  • 使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联.
  • 需要考虑”透明方式”和”安全方式”.

结构型模式-组合(composite)相关推荐

  1. 结构型模式——组合模式(Composite)

    开头 今天我们学习一下组合模式,一说到组合两个字你会想到什么呢?UML关系中的组合关系?图片和拼图?文件夹和文件?列表和节点?在学习组合模式之前我觉得很有必要复习一下组合关系和聚合关系的区别? 组合关 ...

  2. 《设计模式详解》结构型模式 - 组合模式

    组合模式 5.6 组合模式 5.6.1 概述 5.6.2 结构 5.6.3 案例实现 5.6.4 组合模式的分类 5.6.5 优点 5.6.6 使用场景 完整的笔记目录:<设计模式详解>笔 ...

  3. 不得不说的结构型模式-组合模式

    组合模式是一种结构型设计模式,它允许您将对象组合成树形结构,并以统一的方式处理它们.该模式基于递归组合的想法,其中一个组件可以由许多更小的组件组成,这些更小的组件可以由更小的组件组成,以此类推. 在组 ...

  4. 设计模式 — 结构型模式 — 组合模式

    目录 文章目录 目录 组合模式 应用场景 代码示例 组合模式 组合,将多个对象组合成为一个树状结构,来表示业务逻辑上的层次.组合模式使得用户对单个对象和组合对象的使用具有一致性. 比如,描述一家公司的 ...

  5. 结构型模式之Composite模式

    1.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.适用性 以下情况使用Composite模式 (1 ...

  6. 4.10_composite_结构型模式:组合模式

    结构型模式 --- 组合模式 --- 内容:将对象组合成树形结构以表示"部分 - 整体"的层次结构使用户对单个对象和组合对象的使用具有一致性角色:1. 抽象组件 (Componen ...

  7. 设计模式08: Composite 组合模式(结构型模式)

    Composite 组合模式(结构型模式) 对象容器的问题 在面向对象系统中,我们常会遇到一类具有"容器"特征的对象--即他们在充当对象的同时,又是其他对象的容器. public ...

  8. Composite(组合)--对象结构型模式

    Composite(组合)–对象结构型模式 一.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 二.动机 ...

  9. Java设计模式之结构型:组合模式

    前言: 我们对于上面两幅图片肯定非常熟悉,这两幅图片我们都可以看做是一个文件结构,对于这样的结构我们称之为树形结构.在数据结构中我们知道可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可 ...

最新文章

  1. Numpy-创建数组
  2. 出远门需要检查的物件
  3. DataGridView控件机制及使用大全
  4. rsync的介绍及参数详解,配置步骤,工作模式介绍
  5. python如何打开图片_python如何处理图片
  6. python爬虫论文总结与展望怎么写_论文总结与展望怎么写
  7. win10弹出计算机内存不足,如何解决win10系统提示计算机内存不足的问题
  8. mac 不显示 外接屏幕_苹果电脑外接显示器显示不出来 - 卡饭网
  9. ISME | 浙大黄健华/陈学新等揭示寄生蜂调控寄主营养代谢的新机制
  10. 【学习笔记】网关 路由
  11. matlab社会统计学,浅谈MATLAB在统计学实验教学中的应用
  12. 华厦邓白氏码查询网址
  13. Google Earth Engine(GEE)——使用GEE平台实现全球森林生物量的估算(MODIS数据为例)
  14. Cesium获取延长线
  15. 京东金融被拆分:为未来上市铺路,刘强东仍掌权
  16. 弄懂原型对象和原型链
  17. 【DSP】DTMF 信号的编码和解码
  18. 中国运营商: 为3G快马加鞭
  19. 【深度分析】生鲜行业盈利困难,数字化转型迫在眉睫
  20. 如何缩小安全漏洞爆炸半径,实现服务间零信任安全?

热门文章

  1. 判断用户输入的数字是奇数还是偶数
  2. 《快学scala第二版》第一章 练习答案
  3. oauth2.0--基础--01--理论
  4. 数据结构--队列--js击鼓传花算法实现
  5. 对玩家爱好的深渊领主们--魔兽争霸里的深渊魔王评论
  6. 【代码随想录二刷】Day23-二叉树-C++
  7. 大数据在油气行业的应用前景展望(一)
  8. each函数linux,each的详解
  9. 关于鸿蒙与凤蒙,鸿蒙天道
  10. 多线程复习笔记(九)同步线程(中)