为了巩固跟复习22个设计模式,每天不定时发表一篇(周末大于一篇) 关于设计模式的文稿!今天写的是结构型模式中的“组合模式(对象树、Object Tree)”。
- 组合模式结构
![1e0bac82dec8a223f0c5a9157fadf67c.png](https://i-blog.csdnimg.cn/blog_migrate/8a83bb522b8212c7e422e7a6955e1d1e.jpeg)
组合模式结构
1、组件 (Component) 接口描述了树中简单项目和复杂项目所共有的操作。
2、叶节点 (Leaf) 是树的基本结构, 它不包含子项目。一般情况下, 叶节点最终会完成大部分的实际工作, 因为它们无法将工作指派给其他部分。
3、容器 (Container)——又名 “组合 (Composite)——是包含叶节点或其他容器等子项目的单位。 容器不知道其子项目所属的具体类, 它只通过通用的组件接口与其子项目交互。容器接收到请求后会将工作分配给自己的子项目, 处理中间结果, 然后将最终结果返回给客户端。
4、客户端 (Client) 通过组件接口与所有项目交互。 因此, 客户端能以相同方式与树状结构中的简单或复杂项目交互。
- 适应场景
- 如果你需要实现树状对象结构,就可以使用组合模式。
- 如果希望客户端代码以相同的方式处理简单和复杂的元素,可以使用组合模式。
- 实现方式
- 确保应用的核心模型能够以树状结构表示。 尝试将其分解为简单元素和容器。 记住, 容器必须能够同时包含简单元素和其他容器。
- 声明组件接口及其一系列方法, 这些方法对简单和复杂元素都有意义。
- 创建一个叶节点类表示简单元素。 程序中可以有多个不同的叶节点类。
- 创建一个容器类表示复杂元素。 在该类中, 创建一个数组成员变量来存储对于其子元素的引用。 该数组必须能够同时保存叶节点和容器, 因此请确保将其声明为组合接口类型
- 最后, 在容器中定义添加和删除子元素的方法。
- 组合模式的优缺点
优点:1)你可以利用多态和递归机制更方便地使用复杂树结构。2)开闭原则。无需更改现有代码, 你就可以在应用中添加新元素, 使其成为对象树的一部分。
缺点:对于功能差异较大的类, 提供公共接口或许会有困难。在特定情况下, 你需要过度一般化组件接口, 使其变得令人难以理解。
- 在Java中组合模式的应用
java.awt.Container#add(Component) (几乎广泛存在于 Swing 组件中)javax.faces.component.UIComponent#getChildren() (几乎广泛存在于 JSF UI 组件中)
- 如何识别组合模式
组合可以通过将同一抽象或接口类型的实例放入树状结构的行为方法来轻松识别。