第11章 组合(Composite)模式
我们在开发过程中经常使用到树形结构,它分为叶子节点和和分支节点两种,客户对象在使用这两种对象时经常要对它们加以区别,这样增加了代码的复杂度,也非常容易出错。组合模式为这两种类型提供了统一的接口,可以让我们像操作叶子节点那样方便地操作分支节点。
本章我们将讨论组合模式,主要包含如下内容。
介绍组合模式。
介绍安全的组合模式和透明的组合模式。
使用组合模式应该注意的问题。
11.1 组合模式概述
关于组合模式,GoF给出的定义如下所示。
Compose objects into tree structures to represent partwhole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
将对象组合成树形结构来表现部分-整体的层次关系。组合使得客户一致地使用单个对象和组合对象。
要使客户程序对分支节点和叶子节点进行一样的操作,那么它们外形必须一样——得有相同的接口隐藏具体实现。下面我们先从UML静态类图入手。
静态类图如11-1所示。
图11-1
叶子类Leaf和分支类Composite都实现了Component接口,这样就保证了访问的一致性,此外,还要注意以下两点。
Component接口的operation()方法的实现逻辑一般是:如果这个节点是叶子结构,则执行自己的operation()逻辑;如果是分支结构,除了执行自己的那部分逻辑外,还要递归地调用所有子节点的operation()方法。
Composite除了operation()操作外,还要提供管理子节点的操作,例如add、remove、getChild等操作。