一. 举例

这个例子是书上的,假设有一个公司的组结结构如下:

它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点。

而且最关健的是,它的每一层结构很相似。

代码实现如下:

  1. //公司类,提供接口
  2. class Company
  3. {
  4. public:
  5. Company(string name)
  6. {
  7. m_name = name;
  8. }
  9. virtual ~Company()
  10. {}
  11. virtual void Add(Company *pCom)
  12. {}
  13. virtual void Display(int depth)
  14. {}
  15. protected:
  16. string m_name;
  17. };
  18. //具体公司
  19. class ConcreteCompany : public Company
  20. {
  21. public:
  22. ConcreteCompany(string name): Company(name)
  23. {}
  24. virtual ~ConcreteCompany()
  25. {}
  26. //增加子树或叶子
  27. void Add(Company *pCom)
  28. {
  29. m_listCompany.push_back(pCom);
  30. }
  31. //显示
  32. void Display(int depth)
  33. {
  34. for(int i = 0;i < depth; i++)
  35. {
  36. cout<<"-";
  37. }
  38. cout<< m_name << endl;
  39. list<Company *>::iterator iter = m_listCompany.begin();
  40. for(; iter != m_listCompany.end(); iter++) //显示下层结点
  41. {
  42. (*iter)->Display(depth + 2);
  43. }
  44. }
  45. private:
  46. list<Company *> m_listCompany;
  47. };
  48. //具体的部门,财务部
  49. class FinanceDepartment : public Company
  50. {
  51. public:
  52. FinanceDepartment(string name):Company(name)
  53. {}
  54. virtual ~FinanceDepartment()
  55. {}
  56. //只需显示,无限添加函数,因为已是叶结点
  57. virtual void Display(int depth)
  58. {
  59. for(int i = 0; i < depth; i++)
  60. cout<<"-";
  61. cout<< m_name << endl;
  62. }
  63. };
  64. //具体的部门,人力资源部
  65. class HRDepartment :public Company
  66. {
  67. public:
  68. HRDepartment(string name):Company(name)
  69. {}
  70. virtual ~HRDepartment()
  71. {}
  72. //只需显示,无限添加函数,因为已是叶结点
  73. virtual void Display(int depth)
  74. {
  75. for(int i = 0; i < depth; i++)
  76. {
  77. cout<<"-";
  78. }
  79. cout<< m_name << endl;
  80. }
  81. };
  82. //////////////////////////////////////////////////////////////////////////
  83. //测试代码
  84. int main()
  85. {
  86. Company *root = new ConcreteCompany("总公司");
  87. Company *leaf1=new FinanceDepartment("财务部");
  88. Company *leaf2=new HRDepartment("人力资源部");
  89. root->Add(leaf1);
  90. root->Add(leaf2);
  91. //华东分公司
  92. Company *mid1 = new ConcreteCompany("华东分公司");
  93. Company *leaf3=new FinanceDepartment("华东分公司财务部");
  94. Company *leaf4=new HRDepartment("华东分公司人力资源部");
  95. mid1->Add(leaf3);
  96. mid1->Add(leaf4);
  97. root->Add(mid1);
  98. //南京办事处
  99. Company *mid2=new ConcreteCompany("南京办事处");
  100. FinanceDepartment *leaf5=new FinanceDepartment("南京办事处财务部");
  101. HRDepartment *leaf6=new HRDepartment("南京办事处人力资源部");
  102. mid2->Add(leaf5);
  103. mid2->Add(leaf6);
  104. root->Add(mid2);
  105. //杭州办事处
  106. Company *mid3=new ConcreteCompany("杭州办事处");
  107. FinanceDepartment *leaf7=new FinanceDepartment("杭州办事处财务部");
  108. HRDepartment *leaf8=new HRDepartment("杭州办事处人力资源部");
  109. mid3->Add(leaf7);
  110. mid3->Add(leaf8);
  111. mid2->Add(mid3);
  112. root->Display(0);
  113. delete leaf1;
  114. delete leaf2;
  115. delete leaf3;
  116. delete leaf4;
  117. delete leaf5;
  118. delete leaf6;
  119. delete leaf7;
  120. delete leaf8;
  121. delete mid1;
  122. delete mid2;
  123. delete root;
  124. return 0;
  125. }

二. 说明

1. 上面公司的结构图其实就是整体与部分的关系,而且的话整体与部分可以一致对待,因为有很多相似之处嘛。

2. 这棵树有两种几能,要么是棵叶,要么是子棵。

其实这种模式就是组合模式。

三. 组合模式

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

要注意两点:

1. “树形”,必须是一种层次结构,有可以向下延伸的分枝,也有不变的树叶。

2. "一致性",也就是要具有很多相似性。

结构图如下:

component:主要是定义统一的接口,说白了也就是提取出相似性。

composite:定义分枝节点,也就是子树。

leaf:定义叶节点,叶节点是没有子节点的。

设计模式C++描述----11.组合(Composite)模式的更多相关文章

  1. Head First 设计模式 —— 11. 组合 (Composite) 模式

    思考题 我们不仅仅要支持多个菜单,升值还要支持菜单中的菜单.你如何处理这个新的设计需求? P355 [提示]在我们的新设计中,真正需要以下三点: P354 我们需要某种属性结构,可以容纳菜单.子菜单和 ...

  2. Ruby设计模式透析之 —— 组合(Composite)

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9153761 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  3. Java 实现组合(Composite)模式

    类图 /** * 树 总体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(St ...

  4. 设计模式之第11章-建造者模式(Java实现)

    设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...

  5. 《图解设计模式》读书笔记5-1 composite模式

    目录 代码 角色 想法 Composite模式即组合模式.它能够使容器和内容具有一致性,创造出递归结构. 举个例子:在文件系统中,文件夹既是内容,也是容器,具有一致性,这样一来,文件系统形成递归结构. ...

  6. C++设计模式实现--组合(Composite)模式

    一. 举例 这个样例是书上的,如果有一个公司的组结结构例如以下: 它的结构非常像一棵树,当中人力资源部和財务部是没有子结点的,详细公司才有子结点. 并且最关健的是,它的每一层结构非常相似. 代码实现例 ...

  7. 八、结构模式之组合(Composite)模式

    组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...

  8. 组合(composite)模式

    定义 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性 组合模式(Composite)将小对象组合成树形结构,使用户操作组合对象如同操作一个单个对象.组 ...

  9. 设计模式C++描述----09.桥接(Bridge)模式

    一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...

随机推荐

  1. Ubuntu 卸载openJDK

    如果你在 Ubuntu 软件中心安装过 OpenJDK,请先使用如下命令将其删除: $ sudo apt-get purge openjdk*

  2. Linux下查看版本信息

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等.   1.# uname -a   (Linux查看版本当前操作系统内核信息)   2.# cat /proc/ ...

  3. js 跳转链接的几种方式

    1.跳转链接 在当前窗口打开 window.location.href="http://www.baidu.com" 等价于 <a href="baidu.com& ...

  4. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射

    一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...

  5. Windows Error的错误代码

    时不时会用到,记录下 0操作成功完成. 1功能错误. 2系统找不到指定的文件. 3系统找不到指定的路径. 4系统无法打开文件. 5拒绝访问. 6句柄无效. 7存储控制块被损坏. 8存储空间不足,无法处 ...

  6. 理解 Redux 的中间件

    将该思想抽象出来,其实和 Redux 就无关了.问题变成,怎样实现在截获函数的执行,以在其执行前后添加自己的逻辑. 为了演示,我们准备如下的示例代码来模拟 Redux dispatch action ...

  7. 一步一步剖析Dictionary实现原理

    本文是对c#中Dictionary内部实现原理进行简单的剖析.如有表述错误,欢迎指正. 主要对照源码来解析,目前对照源码的版本是.Net Framwork 4.8,源码地址. 1. 关键的字段和Ent ...

  8. c++第一个程序“Hello world!”

    c++第一个程序“Hello world!” 打开编译器(这里以vs2013为例) 单击新建项目 选择Win32 控制台应用程序 点击右下角确定 点击完成  点击解决方案管理器  新建cpp文件  右 ...

  9. Kafka技术原理知识点总结

    1.Kafka是由Linkedin公司开发的,使用Scala语言编写的,分布式,多副本,多分区的,发布订阅模式的消息系统,他通常用于日志系统的搭建,2.Kafka和Zookeeper:Kafka通过Z ...

  10. InfluxDB从原理到实战 - InfluxDB常用的基础操作

    0x00 基础操作介绍 在本文中将介绍InfluxDB常用的基础操作,帮助读者建立对InfluxDB的感性认识,快速的动手玩起来,持续查询(Continuous Queies).Group by.Se ...