Spring MVC框架中的DispatcherServlet其实就用了委派模式,也有人称为是代理模式和策略模式的组合。
- 代理模式
使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法。 - 策略模式
策略模式是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
代理模式注重的是过程,委派者注重的是结果。
策略模式注重的是可扩展(外部扩展),委派模式注重的是内部的灵活和复用。
实际应用场景
用户请求(Boss)将任务委派给项目经理(Leader),Leader将任务细化,根据每个人擅长的某一方面将细化后的任务分给指定的员工(Target)。
Boss,指派任务给Leader
public class Boss {
public static void main(String[] args) {
// new Leader().dispatch("加密");
new Leader().dispatch("销售");
}
}
普通员工接口 ITarget
public interface ITarget {
public void doing(String command);
}
项目经理(委派者)
public class Leader {
private Map<String ,ITarget> targets = new HashMap<String ,ITarget>();
public Leader(){
targets.put("加密",new TargetA());
targets.put("销售",new TargetB());
}
public void dispatch(String command){
targets.get(command).doing(command);
}
}
两个普通员工类(被委派者)
public class TargetA implements ITarget{
public void doing(String command) {
System.out.println("开始进行加密算法的实现");
}
}
public class TargetB implements ITarget{
public void doing(String command) {
System.out.println("开始开发销售代码");
}
}
用户请求相当于Boos,Spring MVC框架中的DispatcherServlet相当于项目经理,其他的解析器相当于员工。
- DispatcherServlet的委托流程
用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制。
DispatcherServlet——>HandlerMapping,映射处理器将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象。
DispatcherServlet——>HandlerAdapter,处理器适配器将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器。
DispatcherServlet——> ViewResolver, 视图解析器将把ModelAndView对象(包含模型数据、逻辑视图名)解析为具体的View。
DispatcherServlet——>View,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构。
返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。