组合模式的定义

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

通俗的说, 就是实现了树形结构

通用类图如下:

其中的三个角色如下:

  1. Component 抽象构件角色: 定义参加组合对象的共有方法和属性, 可以定义一些默认的行为或属性
  2. Aggregate 树枝构件: 组合树枝节点和叶子节点形成一个树形结构
  3. Leaf 叶子构件: 其下再没有其的分支, 是遍历的最小单位

抽象构件角色代码:

树枝构件代码:

叶子构件代码:

场景类代码:

组合模式的应用

组合模式的优点:

  1. 高层模块调用简单. 一棵树形机构中所有的节点都是 Component, 局部和整体对调用者来说没有区别, 高层模块不必关心自己处理的是单个对象还是组合结构, 简化了高层模块的代码
  2. 节点自由增加. 如果想增加一个树枝节点、树叶节点, 只要找到它的父节点就可以, 非常容易扩展,符合开闭原则,对以后的维护非常有利

组合模式的缺点:

我们在使用的时候, 树叶和树枝的定义直接使用了实现类, 这在面向接口编程上是很不恰当的, 与依赖倒置原则冲突, 限制了接口的影响范围

组合模式的使用场景:

  1. 维护和展示部分-整体关系的场景, 如树形菜单、文件和文件夹管理
  2. 从一个整体中能够独立出部分模块或功能的场景

只要是树形结构, 就要考虑使用组合模式, 只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深, 应该考虑组合模式

组合模式的扩展

1.真实的组合模式

在上边的例子中, Clien 中进行了树的组装, 而在实际项目中, 数据通常在数据库中, 我们直接从数据库将数据读取放到树上就可以了

2.透明的组合模式

组合模式有两种实现: 透明模式和安全模式. 上面的实现就是安全模式, 透明模式的类图如下:

透明模式就是把用来组合使用的方法放到抽象类中, 通过判断getChild() 的返回值确定是叶子节点还是树枝节点, 在 Leaf 中实现 add等方法要抛出异常, 如果处理不当, 会在运行期出现问题

在透明模式下, 遍历整个树形结构是比较容易的, 不用进行强制类型转换.

透明模式的好处就是它基本遵循了依赖倒置原则, 方便系统扩展

3.组合模式的遍历

有的时候不光要从上向下遍历, 还要从下往上遍历, 也就是通过子节点要找到他的父节点, 这时就要在抽象构件角色中添加 getParent 方法, 也就是在每个节点都增加一个父节点对象

23种设计模式之组合模式相关推荐

  1. 了解23种设计模式之组合模式

    一,什么是组合模式 Composite 模式 也叫组合模式,是构造型的设计模式之一,通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树 二,组合模式的结构 组合模式的角色和职责 Co ...

  2. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之组合模式

    · 组合模式在王者荣耀中的应用 · 一.简述 王者荣耀有非常多的英雄,而且每一个不同的英雄也有其自己对应的皮肤.玩家可以根据需要购买不同的英雄皮肤,体验不同英雄皮肤在对局中的感受. 在本实例中,根据组 ...

  3. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  4. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  5. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  6. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  7. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

  8. 23种设计模式之代理模式

    文章目录 代理模式的定义与特点 代理模式的结构与实现 模式的结构 模式的实现 代理模式的应用场景 代理模式的应用实例 代理模式的扩展 代理模式分类 静态代理 动态代理 在有些情况下,一个客户不能或者不 ...

  9. 23种设计模式----中介者模式----行为型模式

    中介者模式 1.什么是中介者模式 2.中介者模式的角色 3.例子 3.1 项目结构 3.2 共同实体 3.3 抽象的中介者 3.4 抽象的被中介者 3.5 具体的中介者 3.6 具体的被中介者 3.7 ...

最新文章

  1. poj 2785 hash
  2. python with 打开多个文件
  3. PHP学习笔记二: 面向对象设计
  4. OAuth:服务给第三方app授权的协议
  5. SAS对数据变量的处理
  6. Android动态显示和隐藏状态栏
  7. 语音识别技术在汽车上的应用
  8. HTML5离线缓存(Application Cache)
  9. Redis数据结构总结
  10. 【IoT】产品设计:包装盒LOGO设计工艺
  11. android8.1如何升级,关于android8.1实现多个app升级时的注意事项
  12. 数据分析师的任职要求——阿里巴巴
  13. 利用GPS定位[android]
  14. 这可能是JAVA程序员进阶架构师的最佳之路了 !
  15. [智能硬件]是什么?智能硬件应用领域包括哪些?
  16. 基于AT89C51单片机的小型气象站
  17. dmr中继 自建服务器,海能达DMR中继接入BrandMeister教程
  18. AdVoice广告录音制作软件如何音乐语音混音穿插制作广告
  19. Vue笔记(8) - 案例
  20. 基于单片机的智能手环系统设计

热门文章

  1. [数据库]---nosql,非关系型数据库整理
  2. 现代软件工程 第二章 【个人技术】 练习与讨论
  3. JAVA入门级教学之(连接运算符)
  4. java 异步调用 shell_Java 实现异步调用
  5. padding-left在ie8中不生效_陆国应 律师从民法典第209条来看房屋未过户买卖合同是否生效?...
  6. android 收获地址管理,android UiAutomator添加收货地址的用例
  7. 粒子群算法tsp java_粒子群算法解决TSP问题
  8. 2019年Java编程开发值得学习的10大技术
  9. cups共享linux打印机_linux入门-映射网络驱动器
  10. 【LeetCode笔记】剑指 Offer 47. 礼物的最大价值(Java、动态规划)