一. 举例

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

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

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

代码实现如下:

  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. Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令

    在使用Entity Framework Core生成MySQL数据库脚本,对于生成的存储过程,在执行的过程中出现错误,需要在存储过程前面添加 delimiter // 附:可以使用Visual Stu ...

  2. springboot集成Spring Data JPA数据查询

    1.JPA介绍 JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.它的出现主要是为 ...

  3. MySQL 中间件汇总比较

    360 Atlas 较为活跃,Atlas 是由 360 Web平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目.它是在mysql-proxy 0.8.2版本的基础上,对其进行了优 ...

  4. 怎样实现给DEDE5.7的栏目增加栏目图片

    前两天用DEDE做二次开发的时候,遇到一个问题,领导让给每个栏目增加一个栏目图片的功能,网上找了些东西,结合自己实际做的时候的方法,下面详细描述下具体的实现方式(只测试了V5.7版本,对低版本是否适用 ...

  5. Scala 多继承顺序

    Trait多继承顺序: 准则: 如果有超类,则先调用超类的函数. 如果混入的trait有父trait,它会按照继承层次先调用父trait的构造函数. 如果有多个父trait,则按顺序从左到右执行. 所 ...

  6. 三天讲透SpringBoot-初识基础使用

    这次我们来说一下我们的SpringBoot,现在SpringBoot已经成为趋势,在我这里我用三篇文章的形式来讲清楚我们的SpringBoot,大致分为,第一篇讲搭建,基本使用,第二篇三方集成,自动装 ...

  7. 修复IScroll点击无效,增加scrollTo数值容错处理

    个人博客: https://chenjiahao.xyz ============== 最近半年都处于一个非常忙碌的状态,直到现在才有功夫腾出时间记录这段时间以来踩过的一个个坑. 今天先记录关于ISc ...

  8. Kubernetes中的PV和PVC是啥

    K8S引入了一组叫作Persistent Volume Claim(PVC)和Persistent Volume(PV)的API对象,大大降低了用户声明和使用持久化Volume的门槛. 在Pod的Vo ...

  9. 用 Sphinx 搭建博客时,如何自定义插件?

    之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建. 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清 ...

  10. Kibana 快速入门教程

    欢迎关注笔者的公众号: 小哈学Java, 专注于推送 Java 领域优质干货文章!! 个人网站: https://www.exception.site/kibana/kibana-tutorial 什 ...