《设计模式之禅》笔记摘录 - 14.组合模式

组合模式的定义

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

Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. (将对象组合成树形结构以表示部分---整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性。)

Component,抽象构件。角色定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性。

Leaf,叶子构件。叶子对象,其下再也没有其他的分支,也就是遍历的最小单位。

Composite,树枝构件。树枝对象,它的作用是组合树枝节占和叶子节点形成一个树形结构。

组合模式的应用

组合模式的优点

高层模块调用简单。一棵树形机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,也说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。

节点自由增加。使用了组合模式后,我们可以看看,如果想增加一个树枝节点、树叶节点是不是都很容易,只要找到它的父节点就成,非常容易扩展,符合开闭原则,对以后的维护非常有利。

组合模式的缺点

组合模式有一个非常明显的缺点,看到我们在场景类中的定义,提到树叶和树枝使用时的定义了吗?直接使用了实现类!这在面向接口编程上是很不恰当的,与依赖倒置原则冲突,读者在使用的时候要考虑清楚,它限制了你接口的影响范围。

组合模式的使用场景

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

组合模式的注意事项

只要是树形结构,要考虑使用组合模式,这个一定要记住。

只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深,考虑一下组合模式吧。

组合模式的扩展

透明的组合模式

透明模式是把用来组合使用的方法放到抽象类中,比如add()、remove()以及getChildren()等方法(顺便说一下,getChildren一般返回的结果为Iterable的实现类,很多,大家可以看JDK的帮助),不管叶子对象还是树枝对象都有相同的结构,通过判断是getChildren的返回值确认是叶子节点还是树枝节点,如果处理不当,这个会在运行期出现问题,不是很建议的方式;

安全的组合模式

安全模式就不同了,它是把树枝节点和对叶节点彻底分开,树枝节点单独拥有用来组合的方法,这种方法比较安全。

组合模式的遍历

如果要从下往上遍历,怎么处理呢?甭管是树枝节点还是树叶节点,在每个节点都增加了一个属性:父节点对象,这样在树枝节点增加子节点或叶子节点时设置父节点,然后你看整棵树除了根节点外每个节点都有一个父节点,之后逐层向上查找即可。

最佳实践

组合模式在项目中到处都有,比如现在的页面结构一般都是上下结构,上面放系统的Logo,分为两部分:左边是导航菜单,右边是展示区,左边的导航菜单一般都是树形的结构,比父清晰,有非常多的JavaScript源码实现了类似的树形菜单,大家可以到网上搜索一下。还有,大家常用的XML结构也是一个树形结构,根节点、元素节点、值元素这些都与我们的组合模式相匹配,之所以本章节不以XML为例子讲解,是因为很少有人还直接读写XML文件,一股都是用JDOM或者DOM4J了。

相关推荐
九硕智慧建筑一体化厂家4 分钟前
楼宇自控|智慧建筑核心引擎!楼宇自控系统,赋能建筑高效低碳运维
运维·人工智能·笔记·智慧城市
GGMM7891 小时前
施耐德 VX5A1HC90110(VX5A1HD9011)ATV61/ATV71 90‑110KW 电源驱动板详解
笔记·变频器·变频器维修
Wang's Blog2 小时前
PostgreSQL笔记48: 全文检索与向量检索的对比与混合检索实践
笔记·postgresql·全文检索
liuyicenysabel2 小时前
Flask 个人站 iProfile 上线笔记(k3s + Nginx + Let‘s Encrypt)
笔记·nginx·flask
深蓝海拓2 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(十五)后续完善和改进:PLC端数据解析的防粘包、残包、废包、拆包
笔记·学习·plc
小黄蚁3 小时前
LVGL学习笔记(六)
笔记·学习
Wang's Blog3 小时前
PostgreSQL笔记49:向量检索核心算法、索引调优与过滤策略深度解析
笔记·算法·postgresql
疯狂打码的少年3 小时前
【数据结构】交换类排序:冒泡与快速排序
数据结构·笔记·算法·排序算法
chnyi6_ya4 小时前
VideoHallu 论文阅读笔记
论文阅读·笔记
Wang's Blog4 小时前
PostgreSQL笔记51: 基于 pgvector 构建企业级智能问答系统
数据库·笔记·postgresql