简介
组合模式就是组合多个对象造成树形构造以示意具备“局部 – 整体”关系的层次结构。组合模式对单个对象(叶子对象)和组合对象(容器对象)的应用具备一致性。
组合模式的要害是定义一个形象构件类,它既能够代表叶子,也能够代表容器。客户端针对该形象构件进行编程,无需晓得它到底示意的是叶子还是容器,能够对其进行对立解决。
具体实现
对于组合模式的形象构件角色,其代码示例如下:
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() 等办法是没有意义的,如果没有提供相应的错误处理代码,在运行阶段有可能会出错。
平安组合模式
在平安组合模式中,形象构件类没有申明任何治理成员的办法,只申明形象的业务办法。
这样的做法是平安的,因为基本不向叶子对象提供这些治理成员对象的办法,对于叶子对象,客户端不可能调用到这些办法。
绝对的,其毛病就是不够通明,因为叶子构件和容器构件具备不同的办法,客户端不能齐全针对形象编程,必须有区别地看待叶子构件和容器构件。
总结
长处
组合模式的次要长处如下:
组合模式为树形构造的面向对象实现提供了一种灵便的解决方案
在组合模式中减少新的叶子构件和容器构件都很不便,合乎开闭准则
客户端能够统一地应用一个组合构造或其中单个对象,简化了客户端代码
毛病
组合模式的次要毛病如下:
设计较简单,客户端须要破费更多工夫理清类之间的档次关系
在减少新构件时很难对容器中的构件类型进行限度,通常通过运行时进行类型查看来实现