《组合模式》
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
public abstract class Component {
protected String name;
public Component(String name) {
this.name = name;
}
//添加节点
public abstract void add(Component c);
//删除节点
public abstract void remove(Component c);
//显示节点
public abstract void display();
}
public class Composite extends Component {
private List<Component> leafs = new ArrayList<>();
public Composite(String name) {
super(name);
}
@Override
public void add(Component c) {
leafs.add(c);
}
@Override
public void remove(Component c) {
leafs.remove(leafs.indexOf(c));
}
@Override
public void display() {
System.out.println(this.name);
for (Component component : leafs) {
component.display();
}
}
}
public class Leaf extends Component{
public Leaf(String name) {
super(name);
}
@Override
public void display() {
System.out.println(this.name);
}
@Override
public void add(Component c) {
// TODO Auto-generated method stub
}
@Override
public void remove(Component c) {
// TODO Auto-generated method stub
}
}
Component接口中定义了add和remove对叶子节点的操作方法,但是leaf类中是没有这个功能,却也继承了该方法,这样做的好处就是是的叶子节点和枝节点对于外界没有区 别,它们具有完全一致的接口。但是问题也很明显,leaf没有添加节点的功能,所以实现add和remove没有意义。这种方式就叫透明方式。当然也可以选择在component接口 中不提供这两个方法,而是让composite自己提供,这样的话leaf和composite就没有一致的接口,客户端调用时需要判断,有点麻烦,这种方式是安全方式。
总结
当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。