组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
透明方式:在Component中声明所有用来管理子对象的方法,其中包括Add、Remove等。这样实现Component接口的所有子类都具备了Add和Remove。这样做的好处是叶节点和枝节点对于外界没有区别,它们具备完全一致的行为接口。但问题是因为Leaf类不具备Add(),Remove()方法的功能,实现它是没有意义的。
安全方式:在Component接口中不去声明Add和Remove方法,那么子类Leaf也就不需要去实现它,而是在Component声明所有用来管理子类对象的方法,不过由于不够透明,所以树叶和树枝类将不具有相同的接口,客户端的调用需要做相应的判断,带来了不便。
接口定义方法:增加,删除获取等。树枝节点实现这个接口,有一个接口集合的属性,树叶节点实现接口,但是对增加和删除方法不做具体实现。
使用场景:只要是树形结构,就要考虑使用组合模式,这个一定要记住,只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深,考虑一下组合模式
/**
* 构件接口
*/
public interface Component {
void add(Component component); //新增
void remove(Component component); //删除
Component get(int index); //获取
void operation(); //业务方法
}
/**
* 树枝
*/
public class Root implements Component {
private List<Component> list = new ArrayList<>();
@Override
public void add(Component component) {
if (this.list != null){
this.list.add(component);
}
}
@Override
public void remove(Component component) {
if (this.list != null){
this.list.remove(component);
}
}
@Override
public Component get(int index) {
if (list.size() > index){
return this.list.get(index);
}
return null;
}
@Override
public void operation() {
System.out.println("树枝业务方法");
}
}
/**
* 树叶节点
*/
public class Leaf implements Component {
@Override
public void add(Component component) {
System.out.println("树叶不能新增");
}
@Override
public void remove(Component component) {
System.out.println("树叶不能删除");
}
@Override
public Component get(int index) {
return null;
}
@Override
public void operation() {
System.out.println("树叶的业务方法");
}
}
public class Main {
public static void main(String[] args) {
Root root = new Root();
root.add(new Root());
Component component = root.get(0);
System.out.println(component.toString());
root.operation();
Leaf leaf = new Leaf();
leaf.add(component);
leaf.remove(component);
leaf.get(0);
leaf.operation();
}
}