一. 举例

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

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

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

代码实现如下:

  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:定义叶节点,叶节点是没有子节点的。

最新文章

  1. svn的牛逼操作反向merge
  2. java 性能优化(代码优化)
  3. BZOJ1864[ZJOI2006]三色二叉树[树形DP]
  4. easyui的textbox和validatebox的 赋值区别
  5. Android课程---视图组件的总结
  6. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]
  7. 如何利用CSS代码使图片和文字在同一行显示且对齐
  8. SpringMVC学习系列 之 表单标签
  9. BZOJ 1834: [ZJOI2010]network 网络扩容(最大流+最小费用最大流)
  10. Learning How to Learn, Part 1
  11. 201521123026《Java程序设》 第10周学习总结
  12. [Linux 使用(2)] 64位Linux下安装jboss-as-7.1 以及jdk1.7
  13. PS 滤镜算法原理——曝光过度
  14. 前端性能优化(css动画篇)
  15. Ubuntu16.04 导入tensorflow报错
  16. python之数据类型与变量
  17. pip安装插件库
  18. 使用 github Pages 服务建立个人独立博客全过程
  19. 机器学习理论基础学习3.3--- Linear classification 线性分类之logistic regression(基于经验风险最小化)
  20. JMS异步消息机制

热门文章

  1. Spring boot 梳理 - Spring boot自动注册DispatcherServlet
  2. C#刷遍Leetcode面试题系列连载(1) - 入门与工具简介
  3. thymeleaf常用配置说明
  4. Oracle 的 rownum 问题
  5. Zookeeper监控(Zabbix)
  6. java第2天:类,对象,封装和构造方法
  7. Spring系列(六):Spring事务源码解析
  8. springmvc中将servlet api对象作为处理方法的入参使用
  9. Linux内存描述之内存区域zone–Linux内存管理(三)
  10. SQL Server 2012企业版和标准版的区别