设计模式C++描述----11.组合(Composite)模式
一. 举例
这个例子是书上的,假设有一个公司的组结结构如下:

它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点。
而且最关健的是,它的每一层结构很相似。
代码实现如下:
- //公司类,提供接口
- class Company
- {
- public:
- Company(string name)
- {
- m_name = name;
- }
- virtual ~Company()
- {}
- virtual void Add(Company *pCom)
- {}
- virtual void Display(int depth)
- {}
- protected:
- string m_name;
- };
- //具体公司
- class ConcreteCompany : public Company
- {
- public:
- ConcreteCompany(string name): Company(name)
- {}
- virtual ~ConcreteCompany()
- {}
- //增加子树或叶子
- void Add(Company *pCom)
- {
- m_listCompany.push_back(pCom);
- }
- //显示
- void Display(int depth)
- {
- for(int i = 0;i < depth; i++)
- {
- cout<<"-";
- }
- cout<< m_name << endl;
- list<Company *>::iterator iter = m_listCompany.begin();
- for(; iter != m_listCompany.end(); iter++) //显示下层结点
- {
- (*iter)->Display(depth + 2);
- }
- }
- private:
- list<Company *> m_listCompany;
- };
- //具体的部门,财务部
- class FinanceDepartment : public Company
- {
- public:
- FinanceDepartment(string name):Company(name)
- {}
- virtual ~FinanceDepartment()
- {}
- //只需显示,无限添加函数,因为已是叶结点
- virtual void Display(int depth)
- {
- for(int i = 0; i < depth; i++)
- cout<<"-";
- cout<< m_name << endl;
- }
- };
- //具体的部门,人力资源部
- class HRDepartment :public Company
- {
- public:
- HRDepartment(string name):Company(name)
- {}
- virtual ~HRDepartment()
- {}
- //只需显示,无限添加函数,因为已是叶结点
- virtual void Display(int depth)
- {
- for(int i = 0; i < depth; i++)
- {
- cout<<"-";
- }
- cout<< m_name << endl;
- }
- };
- //////////////////////////////////////////////////////////////////////////
- //测试代码
- int main()
- {
- Company *root = new ConcreteCompany("总公司");
- Company *leaf1=new FinanceDepartment("财务部");
- Company *leaf2=new HRDepartment("人力资源部");
- root->Add(leaf1);
- root->Add(leaf2);
- //华东分公司
- Company *mid1 = new ConcreteCompany("华东分公司");
- Company *leaf3=new FinanceDepartment("华东分公司财务部");
- Company *leaf4=new HRDepartment("华东分公司人力资源部");
- mid1->Add(leaf3);
- mid1->Add(leaf4);
- root->Add(mid1);
- //南京办事处
- Company *mid2=new ConcreteCompany("南京办事处");
- FinanceDepartment *leaf5=new FinanceDepartment("南京办事处财务部");
- HRDepartment *leaf6=new HRDepartment("南京办事处人力资源部");
- mid2->Add(leaf5);
- mid2->Add(leaf6);
- root->Add(mid2);
- //杭州办事处
- Company *mid3=new ConcreteCompany("杭州办事处");
- FinanceDepartment *leaf7=new FinanceDepartment("杭州办事处财务部");
- HRDepartment *leaf8=new HRDepartment("杭州办事处人力资源部");
- mid3->Add(leaf7);
- mid3->Add(leaf8);
- mid2->Add(mid3);
- root->Display(0);
- delete leaf1;
- delete leaf2;
- delete leaf3;
- delete leaf4;
- delete leaf5;
- delete leaf6;
- delete leaf7;
- delete leaf8;
- delete mid1;
- delete mid2;
- delete root;
- return 0;
- }
二. 说明
1. 上面公司的结构图其实就是整体与部分的关系,而且的话整体与部分可以一致对待,因为有很多相似之处嘛。
2. 这棵树有两种几能,要么是棵叶,要么是子棵。
其实这种模式就是组合模式。
三. 组合模式
定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。
要注意两点:
1. “树形”,必须是一种层次结构,有可以向下延伸的分枝,也有不变的树叶。
2. "一致性",也就是要具有很多相似性。
结构图如下:

component:主要是定义统一的接口,说白了也就是提取出相似性。
composite:定义分枝节点,也就是子树。
leaf:定义叶节点,叶节点是没有子节点的。
设计模式C++描述----11.组合(Composite)模式的更多相关文章
- Head First 设计模式 —— 11. 组合 (Composite) 模式
思考题 我们不仅仅要支持多个菜单,升值还要支持菜单中的菜单.你如何处理这个新的设计需求? P355 [提示]在我们的新设计中,真正需要以下三点: P354 我们需要某种属性结构,可以容纳菜单.子菜单和 ...
- Ruby设计模式透析之 —— 组合(Composite)
转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9153761 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...
- Java 实现组合(Composite)模式
类图 /** * 树 总体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(St ...
- 设计模式之第11章-建造者模式(Java实现)
设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...
- 《图解设计模式》读书笔记5-1 composite模式
目录 代码 角色 想法 Composite模式即组合模式.它能够使容器和内容具有一致性,创造出递归结构. 举个例子:在文件系统中,文件夹既是内容,也是容器,具有一致性,这样一来,文件系统形成递归结构. ...
- C++设计模式实现--组合(Composite)模式
一. 举例 这个样例是书上的,如果有一个公司的组结结构例如以下: 它的结构非常像一棵树,当中人力资源部和財务部是没有子结点的,详细公司才有子结点. 并且最关健的是,它的每一层结构非常相似. 代码实现例 ...
- 八、结构模式之组合(Composite)模式
组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...
- 组合(composite)模式
定义 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性 组合模式(Composite)将小对象组合成树形结构,使用户操作组合对象如同操作一个单个对象.组 ...
- 设计模式C++描述----09.桥接(Bridge)模式
一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...
随机推荐
- ol/ul/dl的区别
一.无序列表-ul(unorder list) 1.语法 <ul></ul>->Unorder List ...
- 利用百度云接口实现车牌识别·python
一个小需求---实现车牌识别. 目前有两个想法 1. 调云在线的接口或者使用SDK做开发(配置环境和变异第三方库麻烦,当然使用python可以避免这些问题) 2. 自己实现车牌识别算法(复杂) 一开始 ...
- P5369 [PKUSC2018]最大前缀和
状态压缩 P5369 题意:求所有排列下的最大前缀和之和 一步转化: 求最大前缀和的前缀由数集S组成的方案数, 统计答案时直接乘上sum(S)即可 考虑最大前缀和的性质: 设最大前缀和为sum[i] ...
- SSM相关知识
1.SpringMVC的工作流程? 1. 用户发送请求至前端控制器DispatcherServlet 2. DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3 ...
- 关于CSS的书写规范和顺序
关于CSS的书写规范和顺序,是大部分前端er都必须要攻克的一门关卡,如果没有按照良好的CSS书写规范来写CSS代码,会影响代码的阅读体验.这里总结了一个CSS书写规范.CSS书写顺序供大家参考,这些是 ...
- IDEA 学习笔记之 Console显示日志大小
Console显示日志大小: IntelliJ IDEA默认的Output输出缓存区大小只有1024KB,超过大小限制的就会被清除,而且还会显示[too much output to process] ...
- Laravel Entrust 权限管理扩展包的使用笔记
简介 Entrust 是一个简洁而灵活的基于角色进行权限管理的 Laravel 扩展包.针对 Laravel 5,官方推荐的安装版本是 5.2.x-dev.它的详细使用方法请查看 Entrust Gi ...
- 《构建之法》项目管理&典型用户和场景
项目管理 PM的能力要求和任务: 1.观察.理解和快速学习能力 2.分析管理能力 3.一定的专业能力 4.自省的能力 在一个项目中,PM的具体任务: 1.带领团队形成团队的目标/远景,把抽象的目标 ...
- 六、springboot 简单优雅是实现短信服务
前言 上一篇讲了 springboot 集成邮件服务,接下来让我们一起学习下springboot项目中怎么使用短信服务吧. 项目中的短信服务基本上上都会用到,简单的注册验证码,消息通知等等都会用到.所 ...
- Web页面解析过程(浅)
web页面流程 域名解析DNS 域名解析:把域名指向网络空间IP,让人们通过简单的域名访问Web网站的服务. DNS:域名系统 DNS服务器:记录着域名及其对应的IP地址 解析域名: 浏览器中输入 ...