组合模式是将一系列相同类型的对象组合在一起,然后把它当作单个对象一样使用。如果在开发中,我们总是对同一接口的不同实例对象做相同的操作,那我们应该使用组合模式来简化调用。
组合模式通常由三个部分组成,Component
、Leaf
和Composite
。
下面以一个界面组件的示例来演示一下组合模式,假如我们对界面组件抽象出一个View接口,它有一个方法绘制方法draw。
public interface View {
void draw();
}
有一个具体的界面组件实现类ViewImpl,它实现了draw方法,用于绘制自身组件。
public class ViewImpl implements View {
@Override
public void draw() {
System.out.println("draw myself");
}
}
有一个容器类ViewGroup,它可以存放多个界面组件,当调用其draw方法时,它会统一调用自己内部的所有的View的draw方法。
public class ViewGroup implements View {
private View[] children;
@Override
public void draw() {
for (View view : children) {
view.draw();
}
}
}
这样当外部使用时就无需单独调用每一个View的draw方法来绘制,而是调用ViewGroup的draw方法即可,尤其是当ViewGroup也是另外一个ViewGroup的children中的一个时,一层一层,我们只需要调用最外层的ViewGroup即可,简化了大量的工作。
组合模式主要用于当一组相同类型的对象总是执行相似的动作,我们可以把这一组对象组合成为一个对象,尤其适合上面那种多层级的相似结构,可以大大简化外部对该些对象的管理。