当前位置: 首页 > web >正文

《设计模式之禅》笔记摘录 - 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了。

http://www.xdnf.cn/news/17450.html

相关文章:

  • 库函数NTC采样温度的方法(STC8)
  • Seata分布式事务环境搭建
  • linux-LVM 逻辑卷管理
  • Uniworld-V1、X-Omni论文解读
  • 数据结构(二叉树)
  • 【ee类保研面试】其他类---计算机网络
  • 机器学习之支持向量机(原理)
  • [激光原理与应用-185]:光学器件 - BBO、LBO、CLBO晶体的全面比较
  • VSCode 禁用更新检查的方法
  • 实现一个进程池(精讲)
  • 大模型量化上溢及下溢解析
  • 常见数据结构介绍(顺序表,单链表,双链表,单向循环链表,双向循环链表、内核链表、栈、队列、二叉树)
  • LeetCode 刷题【34. 在排序数组中查找元素的第一个和最后一个位置、35. 搜索插入位置】
  • Redis7集群搭建与原理分析
  • 基于Web的交互式坐标系变换矩阵计算工具
  • BGP综合实验练习作业
  • 使用OAK相机实现智能物料检测与ABB机械臂抓取
  • 从零构建TransformerP2-新闻分类Demo
  • Langchain入门:构建一个基于SQL数据的问答系统
  • 後端開發技術教學(三) 表單提交、數據處理
  • 汽车零部件深孔加工质控升级:新启航激光频率梳 3D 测量解决传统光学扫描遮挡
  • 应急响应流程
  • ADB 命令执行模块开发:双模式(普通模式Shell交互模式)实现、线程安全与资源管理优化
  • Nextcloud容器化部署新范式:Docker与Cpolar如何重塑私有云远程访问能力
  • 为什么输入 URL 后会显示页面?HTTP 协议的 “幕后操作”
  • docker缓存目录转移设置和生效过程
  • WPF 双击行为实现详解:DoubleClickBehavior 源码分析与实战指南
  • linux信号量和日志
  • 杂谈 001 · VScode / Copilot 25.08 更新
  • 【系统编程】进程初识