简介
组合模式也成为部分整体模式,它将一组相似的对象看作一个对象来处理,并根据一个树状结构来组合对象,然后提供统一的方法去访问相应的对象
定义
将对象表示成树形结构以表示“部分—整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
使用场景
表示对象的部分、整体层次结构时
从一个整体中能够独立出部分模块或功能的场景
关键点
一个抽象根节点—声明组合对象的接口,在适当情况下实现所有类共有接口的缺省行为
一个枝干节点角色—继承于根节点,定义与叶子节点有关的枝干行为
一个叶子节点—继承于根节点,实现具体逻辑
实现
/**
* 抽象根节点
*/
public abstract class AbsComponent {
protected String name;
public AbsComponent(String name) {
this.name = name;
}
/**
* 具体节点行为
*/
public abstract void doSomething();
}
/**
* 枝干节点
*/
public class Composite extends AbsComponent {
/**
* 存储节点的容器
*/
private List<AbsComponent> components = new ArrayList<>();
public Composite(String name) {
super(name);
}
/**
* 枝干节点的具体行为
*/
@Override
public void doSomething() {
if (!components.isEmpty()) {
for (AbsComponent component : components) {
component.doSomething();
}
}
}
/**
* 添加节点
*/
public void addChild(AbsComponent component) {
components.add(component);
}
/**
* 移除节点
*/
public void removeChild(int index) {
components.remove(index);
}
}
/**
* 叶子节点
*/
public class Leaf extends AbsComponent {
public Leaf(String name) {
super(name);
}
@Override
public void doSomething() {
Log.i(getClass().getSimpleName(), "叶子节点" + name);
}
}
使用
//构造一个根节点
Composite root = new Composite("根节点");
//构造两个枝干节点
Composite branch1 = new Composite("1号枝干");
Composite branch2 = new Composite("2号枝干");
//构造两个叶子几点
Leaf leaf1 = new Leaf("1号叶子");
Leaf leaf2 = new Leaf("2号叶子");
//将叶子组合到枝干
branch1.addChild(leaf1);
branch2.addChild(leaf2);
//将枝干组合到根节点
root.addChild(branch1);
root.addChild(branch2);
root.doSomething();
小结
优点
清楚的定义分层次的复杂对象,表示对象的全部层次或部分层次,使得高层模块忽略低层模块的差异,方便对整个层次进行控制
高层模块可以一致的使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了高层模块的代码
添加新的枝干结构和叶子结构都非常方便,符合开闭原则,扩展性极高
缺点
在新增节点时不好对枝干中的节点类型进行限制,因为高层模块和低层模块依赖相同的抽象