简介
组合模式就是组合多个对象造成树形构造以示意具备“局部 - 整体”关系的层次结构。组合模式对单个对象(叶子对象)和组合对象(容器对象)的应用具备一致性。
组合模式的要害是定义一个形象构件类,它既能够代表叶子,也能够代表容器。客户端针对该形象构件进行编程,无需晓得它到底示意的是叶子还是容器,能够对其进行对立解决。
具体实现
对于组合模式的形象构件角色,其代码示例如下:
public abstract class Component { // 减少成员 public abstract void add(Component c); // 删除成员 public abstract void remove(Component c); // 获取成员 public abstract Component getChild(int i); // 业务办法 public abstract void operation();}如果继承形象构件类的是叶子构件,其代码示例如下:public class Leaf extends Component { @Override public void add(Component c) { // 减少成员 // 异样解决或业务提醒 } @Override public void remove(Component c) { // 删除成员 // 异样解决或业务提醒 } @Override public Component getChild(int i) { // 获取成员 // 异样解决或业务提醒 } @Override public void operation() { // 业务办法 // 叶子构件具体业务办法的实现 }}
如果继承形象构件类的是容器构件,其代码示例如下:
import java.util.ArrayList; public class Composite extends Component { private final ArrayList<Component> list = new ArrayList<>(); @Override public void add(Component c) { // 减少成员 list.add(c); } @Override public void remove(Component c) { // 删除成员 list.remove(c); } @Override public Component getChild(int i) { // 获取成员 return (Component) list.get(i); } @Override public void operation() { // 业务办法 // 叶子构件具体业务办法的实现 // 递归调用成员构件的业务办法 for (Component obj : list) { obj.operation(); } } }
分类
在应用组合模式时,依据形象构件类的定义模式,能够将组合模式分为通明组合模式和平安组合模式两种。
通明组合模式
在通明组合模式中,形象构件类申明了所有用于治理成员的办法,如 add()、remove()、getChild() 等所有办法。
通明组合模式也是组合模式的规范模式,这样做的益处是确保所有的构件类都应用雷同的接口。
其毛病就是不够平安,因为叶子对象和容器对象有实质上的区别,对叶子对象提供 add()、remove()、getChild() 等办法是没有意义的,如果没有提供相应的错误处理代码,在运行阶段有可能会出错。
平安组合模式
在平安组合模式中,形象构件类没有申明任何治理成员的办法,只申明形象的业务办法。
这样的做法是平安的,因为基本不向叶子对象提供这些治理成员对象的办法,对于叶子对象,客户端不可能调用到这些办法。
绝对的,其毛病就是不够通明,因为叶子构件和容器构件具备不同的办法,客户端不能齐全针对形象编程,必须有区别地看待叶子构件和容器构件。
总结
长处
组合模式的次要长处如下:
组合模式为树形构造的面向对象实现提供了一种灵便的解决方案
在组合模式中减少新的叶子构件和容器构件都很不便,合乎开闭准则
客户端能够统一地应用一个组合构造或其中单个对象,简化了客户端代码
毛病
组合模式的次要毛病如下:
设计较简单,客户端须要破费更多工夫理清类之间的档次关系
在减少新构件时很难对容器中的构件类型进行限度,通常通过运行时进行类型查看来实现