一、介绍
开发中经常会遇到这样一个需求,列表数据做多级显示,对于整体——部分这类场景可以用组合模式来解决,提取出公共信息成立一个基类,多级结构分级成立不同的类,分别都继承基类,实现基类中定义的方法,同时在各级子类中聚合基类,形成根节点中包含下一级根节点和叶子节点这种树状结构。
二、UML类图
这个例子中是需要展示学校下属学院,学院下属的系,多级分层全部显示,这里提取出学校、学院、系的公共信息,包含了名字、添加和删除操作,将这些公共信息成立一个基类Organization,同时定义一个print方法,需要各级机构去实现,各级机构继承基类的同时,还要聚合基类,这样使得各级子结构可以添加、删除自己的根节点和叶子节点,实现多级树状结构。
三、代码示例
public abstract class Organization {
private String mName;
public Organization(String name) {
this.mName = name;
}
public String getName() {
return mName;
}
public void setName(String name){
mName = name;
}
protected void addOrganization(Organization organization){}
protected void removeOrganization(Organization organization){}
protected abstract void print();
}
public class University extends Organization{
private final List<Organization> mOrganizations = new ArrayList<>();
public University(String name) {
super(name);
}
@Override
protected void addOrganization(Organization organization) {
super.addOrganization(organization);
mOrganizations.add(organization);
}
@Override
protected void removeOrganization(Organization organization) {
super.removeOrganization(organization);
mOrganizations.remove(organization);
}
@Override
protected void print() {
System.out.println("***********"+getName()+"***********");
for (Organization organization : mOrganizations) {
organization.print();
}
}
}
public class College extends Organization{
private final List<Organization> mOrganizations = new ArrayList<>();
public College(String name) {
super(name);
}
@Override
protected void addOrganization(Organization organization) {
super.addOrganization(organization);
mOrganizations.add(organization);
}
@Override
protected void removeOrganization(Organization organization) {
super.removeOrganization(organization);
mOrganizations.remove(organization);
}
@Override
protected void print() {
System.out.println(" *********"+getName()+"********* ");
for (Organization organization : mOrganizations) {
organization.print();
}
}
}
public class Department extends Organization{
public Department(String name) {
super(name);
}
@Override
protected void print() {
System.out.println(" *******"+getName()+"******* ");
}
}
组合模式关键在于提取公共信息成立一个基类,让各级子类都去继承这个基类,同时定义一个抽象方法,各级子类根据各自的业务去实现这个抽象方法,从而形成各级结构的差异化,子类聚合基类的处理方式使得系统实现层级结构。
四、总结
对于对数据需要进行整体——部分分层处理的这种场景,组合模式尤为合适,这种模式上层结构不需要关心下层处理的是单层对象还是组合对象,下层结果自行根据自己是根节点还是叶子节点去递归处理。在Java中HashMap这种常用的数据结构就是根据组合模式实现的。