组合模式(composite)C++实现
组合模式
意图:
将对象组合成树形结构以表示‘部分-整体’的层次结构,所以有时候又叫做部分-整体模式。组合模式使得用户对单个对象和组合对象的使用具有一致性。,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
适用性:
当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时。
优点:
组合模式使得基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。
组合模式让客户可以一致的使用组合结构和单个对象。
UML:

抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。在安全式的合成模式里,构件角色并不是定义出管理子对象的方法,这一定义由树枝构件对象给出。
树叶构件(Leaf)角色:树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。
树枝构件(Composite)角色:代表参加组合的有下级子对象的对象。树枝对象给出所有的管理子对象的方法,如add()、remove()、getChild()等。
代码实现:输出对应公司结构和其部门职责,这里总公司、分公司、各种部门都有共同的接口

composite.h实现:
#ifndef COMPOSITE_H
#define COMPOSITE_H #include <list>
using std::list; #include <string>
using std::string; #include <iostream>
using namespace std; class Company
{
public:
Company(char* name):mName(name){}
virtual void attach(Company* cpn){}
virtual void detach(Company* cpn){}
virtual void display(string str){} virtual void LineOfDuty(string company){} protected:
char* mName;
list<Company* > mList;
}; class ConcreteCompany:public Company{
public:
ConcreteCompany(char* name):Company(name){}
virtual void attach(Company* cpn);
virtual void detach(Company* cpn);
virtual void display(string str);
virtual void LineOfDuty(string company);
}; class HrDepartment:public Company{
public:
HrDepartment(char* name):Company(name){}
virtual void display(string str); virtual void LineOfDuty(string company);
}; class FinanceDepartment:public Company{
public:
FinanceDepartment(char* name):Company(name){}
virtual void display(string str); virtual void LineOfDuty(string company);
}; #endif
composite.cpp:
#include "composite.h"
#include <iostream>
using namespace std; void ConcreteCompany::attach(Company* cpn)
{
if(nullptr != cpn)
{
mList.push_back(cpn);
}
} void ConcreteCompany::detach(Company* cpn)
{
if(nullptr != cpn)
{
mList.remove(cpn);
}
} void ConcreteCompany::display(string str)
{
list<Company* >::iterator beg = mList.begin();
cout<<str<<mName<<endl;
str = str + str;
for ( ; beg != mList.end(); beg++)
{
(*beg)->display(str);
}
} void ConcreteCompany::LineOfDuty(string company)
{
list<Company* >::iterator beg = mList.begin();
string name = mName;
for ( ; beg != mList.end(); beg++)
{
(*beg)->LineOfDuty(name);
}
} void HrDepartment::display(string str)
{
cout<<str<<mName<<endl;
} void HrDepartment::LineOfDuty(string company)
{
cout<<company<<"员工招聘培训管理!"<<endl;
} void FinanceDepartment::display(string str)
{
cout<<str<<mName<<endl;
} void FinanceDepartment::LineOfDuty(string company)
{
cout<<company<<"公司财务收支管理!"<<endl;
}
main.cpp:
#include <iostream>
#include "composite.h"
using namespace std; void main()
{
//
ConcreteCompany com1("木鸟飞公司");
FinanceDepartment com2("总公司财务部");
HrDepartment com3("总公司人力部"); com1.attach(&com2);
com1.attach(&com3); ConcreteCompany com11("木鸟飞东北分公司");
FinanceDepartment com22("东北分公司财务部");
HrDepartment com33("东北分公司人力部"); com11.attach(&com22);
com11.attach(&com33); com1.attach(&com11); string str("─");
com1.display(str); cout<<endl; com1.LineOfDuty(str);
return;
}
组合模式(composite)C++实现的更多相关文章
- 组合模式/composite模式/对象结构型模式
组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...
- 浅谈设计模式--组合模式(Composite Pattern)
组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...
- 二十四种设计模式:组合模式(Composite Pattern)
组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...
- 设计模式(七)组合模式Composite(结构型)
设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...
- 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...
- 【设计模式】组合模式 Composite Pattern
树形结构是软件行业很常见的一种结构,几乎随处可见, 比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...
- 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释
组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...
- 设计模式系列之组合模式(Composite Pattern)——树形结构的处理
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式--组合模式Composite(结构型)
一.概念 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 二.UML图 1.Component(对象接口),定义 ...
- C#设计模式——组合模式(Composite Pattern)
一.概述 在软件开发中,我们往往会遇上类似树形结构的对象体系.即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在.比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点.在设计这 ...
随机推荐
- 团体程序设计天梯赛-练习集-*L1-043. 阅览室
L1-043. 阅览室 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为不超过100 ...
- 前端开发—HTML
HTML介绍 web服务的本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen( ...
- centos7安装mwget下载资源,提升下载速度
1.安装mwget wget http://jaist.dl.sourceforge.net/project/kmphpfm/mwget/0.1/mwget_0.1.0.orig.tar.bz2 ta ...
- css 陌生属性
记录一些我之前没见过属性 1.width:100vh 100vh 2.min-height:calc(100vh + 51px);cale 3.:nth-child nth-child 和 :n ...
- 利用pandas库中的read_html方法快速抓取网页中常见的表格型数据
本文转载自:https://www.makcyun.top/web_scraping_withpython2.html 需要学习的地方: (1)read_html的用法 作用:快速获取在html中页面 ...
- python 图片滑动窗口
METHOD #1: No smooth, just scaling. def pyramid(image, scale=1.5, minSize=(30, 30)): # yield the ori ...
- WebApplicationContext初始化(转)
ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应用的容器”了:在We ...
- 关于DM8168中移植算法速度慢、效率低的新发现
有不少的朋友,特别是刚刚接触DSP的朋友.基于DVRRDK编写C代码发现执行速度特别慢,我在上面简单的对每一个像素的UV分量赋值=0x80,这样就成了灰度图像.对1080P图像进行操作,发现处理每帧要 ...
- leetcode解题文件夹
点击打开链接点击打开链接点击打开链接參考文献:http://blog.csdn.net/lanxu_yy/article/details/17848219 只是本文准备用超链接的方式连接到对应解答页面 ...
- Fitnesse FIT的使用
FIT是fitnesse使用的默认的引擎(SLIM的使用在上一篇文章中说明),不需要特别声明即可使用执行表格测试,所有编写的fixture都需要继承Fit的Fitxture 编写测试用例前需要先声明c ...