组合模式
组合模式
本文介绍组合模式定义、结构、特点、适用场景、代码实现。
组合模式
1 模式的定义
组合是一种结构型设计模式,你可以使用它将对象组合成树状结构,并且能像使用独立对象一样使用它们。
2 模式的结构
2.1 结构图
2.2 参与者
- 组件(Component)接口描述了树中简单项目和复杂项目所共有的操作。
- 叶节点(Leaf)是树的基本结构,它不包含子项目。一般情况下,叶节点最终会完成大部分的实际工作,因为它们无法将工作指派给其他部分。
- 容器(Container)——又名“组合(Composite)”——是包含叶节点或其他容器等子项目的单位。容器不知道其子项目所属的具体类,它只通过通用的组件接口与其子项目交互。容器接收到请求后会将工作分配给自己的子项目,处理中间结果,然后将最终结果返回给客户端。
3 模式分析
3.1 优点
- 你可以利用多态和递归机制更方便地使用复杂树结构。
- 开闭原则。无需更改现有代码,你就可以在应用中添加新元素,使其成为对象树的一部分。
3.2 缺点
- 对于功能差异较大的类,提供公共接口或许会有困难。在特定情况下,你需要过度一般化组件接口,使其变得令人难以理解。
4 适用环境
如果你需要实现树状对象结构,可以使用组合模式。组合模式为你提供了两种共享公共接口的基本元素类型:简单叶节点和复杂容器。容器中可以包含叶节点和其他容器。这使得你可以构建树状嵌套递归对象结构。
如果你希望客户端代码以相同方式处理简单和复杂元素,可以使用该模式。组合模式中定义的所有元素共用同一个接口。在这一接口的帮助下,客户端不必在意其所使用的对象的具体类。
5 实现方式
- 确保应用的核心模型能够以树状结构表示。尝试将其分解为简单元素和容器。记住,容器必须能够同时包含简单元素和其他容器。
- 声明组件接口及其一系列方法,这些方法对简单和复杂元素都有意义。
- 创建一个叶节点类表示简单元素。程序中可以有多个不同的叶节点类。
- 创建一个容器类表示复杂元素。在该类中,创建一个数组成员变量来存储对于其子元素的引用。该数组必须能够同时保存叶节点和容器,因此请确保将其声明为组合接口类型。实现组件接口方法时,记住容器应该将大部分工作交给其子元素来完成。
- 最后,在容器中定义添加和删除子元素的方法。记住,这些操作可在组件接口中声明。这将会违反「接口隔离原则」,因为叶节点类中的这些方法为空。但是,这可以让客户端无差别地访问所有元素,即使是组成树状结构的元素。
6 代码实现
https://github.com/august295/DesignPatternCode
参考
本文由作者按照 CC BY 4.0 进行授权