一句话定义
又叫部分整体模式,将树形结构的每一个节点作为对象,组合成为整个树形结构。
使用场景
树形结构,分层分组的情况。
各个元素节点具有类似的属性。
实现要点
1.所有的节点实现同一个接口,内部并组合该接口
2.安全的组合模式元素抽象只包含简单共同结构,根、叶具体逻辑自己实现
3.透明的组合模式元素抽象结构完全一致,根、叶在内部判断子节点类型
情景假设
实现一个简单树型结构。
这里使用透明的组合模式。
实现步骤
1.创建抽象元素节点
/**
* 组合模式 抽象元素节点
*
* @author fengzhen
* @version 1.0, 2017/5/22
*/
public abstract class Component {
protected String name;
public Component(String name) {
this.name = name;
}
/**
* 添加子节点
*
* @author fengzhen
* @version 1.0, 2017/5/22 14:29
*/
public abstract boolean addChild(Component child);
/**
* 删除子节点
*
* @author fengzhen
* @version 1.0, 2017/5/22 14:29
*/
public abstract boolean removeChild(Component child);
/**
* 获取子节点
*
* @author fengzhen
* @version 1.0, 2017/5/22 14:29
*/
public abstract Component getChild(int index);
/**
* 节点完成事件
*
* @author fengzhen
* @version 1.0, 2017/5/22 14:29
*/
public abstract void execute();
}
2.创建具体的根节点
/**
* 根和枝干节点的具体实现
*
* @author fengzhen
* @version 1.0, 2017/5/22
*/
public class Truck extends Component{
private List<Component> components = new ArrayList<>();
public Truck(String name) {
super(name);
}
@Override
public boolean addChild(Component child) {
components.add(child);
return true;
}
@Override
public boolean removeChild(Component child) {
components.remove(child);
return true;
}
@Override
public Component getChild(int index) {
return components.get(index);
}
@Override
public void execute() {
Log.i("info", "execute: ==" + name);
}
}
3.创建具体的页节点
/**
* 叶子节点具体实现
*
* @author fengzhen
* @version 1.0, 2017/5/22
*/
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
@Override
public boolean addChild(Component child) {
return false;
}
@Override
public boolean removeChild(Component child) {
return false;
}
@Override
public Component getChild(int index) {
return null;
}
@Override
public void execute() {
Log.i("info", "execute: == 执行叶子节点" + name);
}
}
4.创建树形结构
Component root = new Truck("root");
Truck truck1 = new Truck("truck1");
Leaf leaf1 = new Leaf("leaf1");
root.addChild(truck1);
root.addChild(leaf1);
Leaf leaf2 = new Leaf("leaf2");
truck1.addChild(leaf2);
也可以添加前驱节点属性,类似文件夹用于返回上层。Android中View和ViewGroup就使用了组合模式