组合模式(为一对多提供统一的接口)
也叫部分整体模式,创建对象组的树形结构,将对象组合成树形结构以表示“整体-部分”的层次关系
场景:院校展示
每个学校有多个学院,每个学院有多个系
按照这个思路,使用List来实现即可,实际上上一节我们也用到了组合模式
实现
编写一个Organization类作为所有组件的抽象,里面给出方法的默认实现(适配器模式)
@Data
public abstract class Organization {
String name;
String description;
void add(Organization organization){
throw new UnsupportedOperationException();
}
void remove(Organization organization){
throw new UnsupportedOperationException();
}
abstract void print();
}
然后不同类别的组件实现这个类,使用List集合来表示一对多的关系
public class College extends Organization{
List<Organization> departments =new LinkedList<>();
@Override
void add(Organization organization) {
departments.add(organization);
}
@Override
void remove(Organization organization) {
departments.remove(organization);
}
@Override
void print() {
System.out.println(name);
departments.forEach(Organization::print);
}
}
public class University extends Organization{
List<Organization> colleges =new LinkedList<>();
@Override
void add(Organization organization) {
colleges.add(organization);
}
@Override
void remove(Organization organization) {
colleges.remove(organization);
}
@Override
void print() {
System.out.println(name);
colleges.forEach(Organization::print);
}
}
public class Department extends Organization{
@Override
void print() {
System.out.println(name);
}
}
如果内部的组合关系发生了变化(假如Colleage变成了第一层的结点),结点内部基本上不用变,因为都是依赖Organization这个抽象层。但是这也要求各个组件内部比较相似,内部差别很大的则不适合使用组合模式