组合模式
定义
组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。
结构
Component(抽象构件):它可以是接口或者是抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子控件的方法。
Leaf(叶子构件):它在组合结构中表示叶子结点对象,叶子结点没有子结点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过抛出异常、提示错误的方式进行处理。
Composite(容器构件):它在组合结构中表示容器结点对象,容器结点包含子结点,其子结点可以是叶子结点,也可以是容器结点,它提供一个集合用于存储的子结点,实现了在抽象空间中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子结点的业务方法。
透明组合模式
类图
实现过程
创建一个抽象类(抽象构件),里面定义了一系列方法(包括叶子节点需要用的以及容器构件需要用的)。创建叶子构件类和容器构件类去继承它。在叶子构件类里面具体实现叶子构件类需要的方法,容器构件类也是如此。然后容器构件和抽象构件之间建立一个聚合关系。
缺点
叶子结点不具备容器的功能,但是它也有相应的方法。
安全组合模式
类图
实现过程
和透明组合模式的区别就是容器构件需要的业务方法不是写在抽象构件类中,编程时要要针对子类(叶子结点类和容器类)编程。
优点
- 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
- 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
- 在组合模式中增加新的容器构件和叶子构件都很方便,符合开闭原则。
- 为树形结构的面向对象实现提供了一种灵活的解决方案。对树形结构的控制非常简单。
缺点
在增加新构件时,很难对容器中的构件类型进行限制。如果一定要实现,必须通过在运行时进行类型检查,这个实现过程较为复杂。
适用环境
- 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致的对待它们。
- 在一个使用面向对象语言开发的系统中,需要处理一个树形结构。
- 在一个系统中能够分离出叶子对象和容器对象,而且他们的类型不固定,需要增加一些新的类型。
总结
创建一个抽象类,然后创建几个类继承它,具体实现里面的方法。这里把这些类又分成两类(叶子结点和容器类)。透明组合模式是把所有的业务方法都写在抽象类里。像叶子结点不需要一些功能,但是它也有这个方法。还有,容器类和抽象类之间要建立一个聚合关系(把容器类当做成员变量传入抽象类)。