第12章 组合模式
组合多个对象形成树形结构以表示“部分——整体”的结构层次,对单个对象(叶子)和组合对象(容器)的使用具有一致性。
1.要点
- 树形结构:容器、叶子
- 容器构件:集合、聚合关联(引入抽象类)、递归调用
- 组合模式:透明/安全
2.模式动机
将容器对象和叶子对象进行递归组合,使用户在使用时无需对它们进行区分,可以一致地对待容器对象和叶子对象。
3.四个角色
- 抽象构件(Component):接口/抽象类,可包含所有子类共有行为的声明和实现,定义访问及管理它的子构件的方法。
- 叶子构件(Leaf):表示叶子节点对象(没有子节点),实现在抽象构件中定义的行为。对于访问和管理子构件的方法,可以通过异常等方式处理。
- 容器构件(Composite):表示容器节点对象(包含子节点),实现抽象构件中定义的行为,包括访问和管理子构件的方法,在其业务方法中递归调用其子节点的业务方法。
- 客户类(Client):通过抽象构件接口访问和控制组合构件中的对象。
4.优点
- 方便对层次结构进行控制
- 客户端一致调用组合结构或其中单个对象,简化客户端代码
- 叶子对象可以被组合成更复杂的容器对象,容器对象有可以被组合,可以形成复杂的树形结构
- 更容易在组合体内加入对象构件,客户端不必因为加入了新对象构件而更改原有代码
5.缺点
- 抽象,如果业务规则复杂则很具挑战性,不是所有方法都与叶子对象子类有关联
- 增加新构件可能产生问题,难以对容器中的构件类型进行限制
6.适用环境
- 需要表示一个对象的整体或部分层次,在具有整体和部分的层次结构中,希望一致对待
- 让客户端忽略不同对象的层次变化,针对抽象构件编程,无需关心细节
- 对象结构动态且复杂程度不一样,客户需要一致处理
7.扩展
透明组合模式:叶子、容器操作一致,不安全
安全组合模式:区别对待叶子、容器,不向叶子对象提供管理成员对象的方法