委派设计模式(Delegate Pattern)是Java中使用的比较多的一种设计模式。意思就是将一组实现了相同接口的类委派给另一个子类(这个类是委派类,不需要实现具体的业务逻辑)来管理。常用与管理接口的多个实现类。控制调用的逻辑。
常见结构如下:
举个栗子,场景1:例如在一个科技公司,各个员工协同做项目开发。
分析: 这个场景里面统一的接口是员工。 各个员工是不同的实现类。项目经理是委托类(也是员工)。项目委托给项目经理后, 他负责协调其他员工来进行项目开发。
① 创建统一接口 Staff
public interface Staff {
/**
* 工作接口
*/
void work();
}
② 创建具体业务的实现Java开发程序员和前端VUE开发程序员
public class JavaProgrammer implements Staff {
@Override
public void work() {
System.out.println(JavaProgrammer.class.getName()+"-Java程序员正在写代码");
}
}
public class VueProgrammer implements Staff {
@Override
public void work() {
System.out.println(VueProgrammer.class.getName()+"-Vue程序员正在画前端界面");
}
}
③ 创建委派类,项目经理ProjectManager
public class ProjectManager implements Staff {
private List<Staff> list ;
public ProjectManager() {
this.list = new ArrayList<>(2);
list.add(new JavaProgrammer());
list.add(new VueProgrammer());
}
@Override
public void work() {
System.out.println(ProjectManager.class.getName()+":项目经理开始安排工作");
if (null != list &&list.size()>0){
list.forEach(Staff::work);
}
System.out.println(ProjectManager.class.getName()+":项目开发完成");
}
}
这就创建了一个委派模式的简单实现,结构如下:
来测试一下:
Staff manager = new ProjectManager();
manager.work();
输出结果:
com.dong.designs.delegate.ProjectManager:项目经理开始安排工作
com.dong.designs.delegate.JavaProgrammer-Java程序员正在写代码
com.dong.designs.delegate.VueProgrammer-Vue程序员正在画前端界面
com.dong.designs.delegate.ProjectManager:项目开发完成
下面来看一下在spring源码中的实现。
这里涉及到了三个角色:
① 统一接口EntityResolver
② 两个具体的业务实现类BeansDtdResolver和PluggableSchemaResolver
③ 委派类DelegatingEntityResolver,它也实现了统一的接口EntityResolver,然后它包含另外两个包含具体业务逻辑的子类。