在学习SpringMVC的过程中,看到了适配器模式,然后就记下了,回来填坑
1. 适配器模式(Adapter Pattern)
将一个接口转换成客户希望的另一个接口,使不兼容的类可一起工作,其组成可分为:
- Target:客户所需要的接口
- Adapter:适配器
- Adaptee:被适配者
2. 流程
2.1 Adaptee
public class Adaptee {
public void adapteeMethod(){
System.out.println("被适配者的方法执行了");
}
}
2.2 Target
public interface Target {
public void targetMethod();
}
2.3 Adapter
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void targetMethod() {
adaptee.adapteeMethod();
}
}
2.4 测试
public class test {
public static void main(String[] args) {
// 创建被适配者
Adaptee adaptee = new Adaptee();
// 创建适配器
Adapter adapter = new Adapter(adaptee);
adapter.targetMethod();
}
}
3. SpringMVC中的应用
先放一张请求流程图,其中涉及到了映射器和适配器以及处理器
网图,侵删
用户发送请求,然后DispatcherServlet通过HandlerMapping映射出对应的Handler以及相关的Interceptors,将这二者绑定到HandlerExecutionChain并返回
由于Handler有很多种类,调用方法也参次不齐,如果将其传进给DispatcherServlet,那么调用方法的时候则需用if(paramHandler instanceof XXXHandler)
这样判断,再调用该Handler的方法,如果Handler种类再继续增加,则需要在DispatcherServlet增加判断,违反开闭原则(对修改关闭,对扩展开放),那么适配器模式就出场了
Spring提供一个适配器模式中的Target接口,那么只要实现了Adapter就可以适配一种Handler,不用在DispatcherServlet里进行判断了。DispatcherServlet内部通过HandlerMapping获取对应的Handler,然后通过Handler来获取HandlerAdapter,最后调用HandlerAdapter的handler方法即可实现处理器功能。此时如果增加一种Handler,则只要增多一个HandlerAdapter实现类即可
这里Handler是广义的,包括我们常说的Controller、Servlet、HttpRequestHandler
Target接口
public interface HandlerAdapter {
// 判断是否支持该Handler
boolean supports(Object handler);
// 适配Handler,并使Handler执行
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}
DispatcherServlet中的doDispatch方法
为了聚集关注点只列出了相关的源码
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
// 变量提升
ModelAndView mv = null;
Exception dispatchException = null;
try {
// 处理请求
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
// 通过HandlerMapping来获取映射出的Handler
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
// 调用HandlerAdapter的handle方法并返回ModelAndView,适配器模式中的对象适配
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 返回ModelAndView
applyDefaultViewName(processedRequest, mv);
mappedHandler.applyPostHandle(processedRequest, response, mv);
}
catch (Exception e) {
XXXXX
}finally {
XXXXX
}
}catch (Exception e) {
XXXXX
}
}