11.5 公司组织结构

在学习和使用组合模式时,Sunny软件公司开发人员发现树形结构其实随处可见,例如Sunny公司的组织结构就是“一棵标准的树”,如图11-8所示:

图11-8  Sunny公司组织结构图

在Sunny软件公司的内部办公系统Sunny OA系统中,有一个与公司组织结构对应的树形菜单,行政人员可以给各级单位下发通知,这些单位可以是总公司的一个部门,也可以是一个分公司,还可以是分公司的一个部门。用户只需要选择一个根节点即可实现通知的下发操作,而无须关心具体的实现细节。这不正是组合模式的“特长”吗?于是Sunny公司开发人员绘制了如图11-9所示结构图:

图11-9  Sunny公司组织结构组合模式示意图

在图11-9中,“单位”充当了抽象构件角色,“公司”充当了容器构件角色,“研发部”、“财务部”和“人力资源部”充当了叶子构件角色。

思考

如何编码实现图11-9中的“公司”类?

11.6 组合模式总结

组合模式使用面向对象的思想来实现树形结构的构建与处理,描述了如何将容器对象和叶子对象进行递归组合,实现简单,灵活性好。由于在软件开发中存在大量的树形结构,因此组合模式是一种使用频率较高的结构型设计模式,Java SE中的AWT和Swing包的设计就基于组合模式,在这些界面包中为用户提供了大量的容器构件(如Container)和成员构件(如Checkbox、Button和TextComponent等),其结构如图11-10所示:

图11-10 AWT组合模式结构示意图

在图11-10中,Component类是抽象构件,Checkbox、Button和TextComponent是叶子构件,而Container是容器构件,在AWT中包含的叶子构件还有很多,因为篇幅限制没有在图中一一列出。在一个容器构件中可以包含叶子构件,也可以继续包含容器构件,这些叶子构件和容器构件一起组成了复杂的GUI界面。

除此以外,在XML解析、组织结构树处理、文件系统设计等领域,组合模式都得到了广泛应用。

      1. 主要优点

组合模式的主要优点如下:

(1) 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。

(2) 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。

(3) 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。

(4) 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。

      2. 主要缺点

组合模式的主要缺点如下:

在增加新构件时很难对容器中的构件类型进行限制。有时候我们希望一个容器中只能有某些特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时进行类型检查来实现,这个实现过程较为复杂。

      3. 适用场景

在以下情况下可以考虑使用组合模式:

(1) 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。

(2) 在一个使用面向对象语言开发的系统中需要处理一个树形结构。

(3) 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。

练习

Sunny软件公司欲开发一个界面控件库,界面控件分为两大类,一类是单元控件,例如按钮、文本框等,一类是容器控件,例如窗体、中间面板等,试用组合模式设计该界面控件库。

【作者:刘伟  http://blog.csdn.net/lovelion】

树形结构的处理——组合模式(五)相关推荐

  1. 树形结构的处理——组合模式(二)

    11.2 组合模式概述 对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象)并调用执行,牵一而动百,其中使用了 ...

  2. 树形结构的处理——组合模式(三)

    11.3  完整解决方案 为了让系统具有更好的灵活性和可扩展性,客户端可以一致地对待文件和文件夹,Sunny公司开发人员使用组合模式来进行杀毒软件的框架设计,其基本结构如图11-5所示: 图11-5  ...

  3. 树形结构的处理——组合模式(四)

    11.4  透明组合模式与安全组合模式 通过引入组合模式,Sunny公司设计的杀毒软件具有良好的可扩展性,在增加新的文件类型时,无须修改现有类库代码,只需增加一个新的文件类作为AbstractFile ...

  4. 组合模式 -- 树形结构处理

    树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得 ...

  5. 【结构型模式五】组合模式

    一.获取计算器店铺的功能的需求 如果计算器店铺是连锁店铺,有总店和各级分店,而每家店铺又有卖计算器的柜台和修计算器的柜台.对客户端来说,想在获取某个柜台的功能时,能得到这个柜台的功能,想在获取某个店铺 ...

  6. 【学习设计模式11】树形处理——组合模式

    上篇: [学习设计模式10]分离抽象与实现--桥接模式_Aiky哇的博客-CSDN博客上篇:[学习设计模式9]兼容扩展坞-适配器模式_Aiky哇的博客-CSDN博客上篇:[学习设计模式8]组装流水线- ...

  7. java设计模式之组合模式(树形层级)

    java设计模式之组合模式 学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来 ...

  8. 【设计模式】组合模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.组合模式简介 二.组合模式适用场景 三.组合模式优缺点 四.组合模式和访问者模式 五.组合模式代码示例 1.书籍和目录的抽象父类 2.书籍类 3.目录类 4.测试类 一.组合模式简介 组 ...

  9. 设计模式之禅之设计模式-组合模式

    一:组合模式的定义         --->组合模式(Composite Pattern)也叫合成模式,有时又叫做部分-整体模式(Part-Whole),主要是用来描述部分与整体的关系      ...

最新文章

  1. df满足条件的值修改_文科生学 Python 系列 16:泰坦尼克数据 2(缺失值处理)
  2. 鼠标放在图片连接上面,预览图片
  3. linux中85379端口如何恢复,技术|如何在 Linux/Unix 系统中验证端口是否打开
  4. Spark HistoryServer日志解析清理异常
  5. 一、Bitmap的recycle问题
  6. CentOS7 SSH相关
  7. 代码雨代码源复制_小程序基于Parser添加长按复制、代码高亮等功能
  8. 20210122发文补充截图
  9. 【转】linux shell 中21含义
  10. 1102: 【入门】字符图形1-星号矩形
  11. 微搭自定义组件库开发环境搭建教程
  12. The Elder(hdu 5956 树上斜率dp + 队列还原)
  13. Android 音乐APP(五)音乐通知栏、后台播放音乐
  14. Elasticsearch5.0 安装 以及 问题集锦
  15. charts中各种图演示
  16. div中的内容居中对齐
  17. 支付宝小程序获取用户的user_id案例
  18. Introduce to Inforamtion Retrieval读书笔记(1)
  19. 三国志11武将资料整理版
  20. 无线蓝牙模块在汽车DSP的应用

热门文章

  1. 演示程序之打游戏 -- 慕司板IAP15
  2. Verilog-时序电路设计
  3. 学习HTML5开发RPG游戏第五步游戏界面设计一
  4. 编译出现 unused parameter [-Werror,-Wunused-parameter]
  5. 那些不再追逐互联网的年轻人们,正遇见下一个「互联网」
  6. 问题 G: 向右看齐
  7. 崔云php_崔云恒新书《我的家乡我的亲》将出版
  8. python geometry用法_Python geometry.MultiPolygon方法代码示例
  9. linux文件系统使用和管理,Linux磁盘使用及文件系统管理
  10. (使用工具)Matlab转C++