在学习设计模式的时候,看到网上最多的是,电压的那个例子,但是说实话,我看了只会,确实也没理解到适配器模式怎么使用,在看springmvc源码的时候,有看到这个模式在框架中的使用,所以,就记录一下
在框架源码中的应用
在springmvc源码中,所有的请求,都会进入到
org.springframework.web.servlet.DispatcherServlet#doDispatch
在这个方法中,有一个很重要的代码,就是获取到处理器适配器,在这里,就是使用的适配器设计模式
org.springframework.web.servlet.DispatcherServlet#getHandlerAdapter
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter ha : this.handlerAdapters) {
if (logger.isTraceEnabled()) {
logger.trace("Testing handler adapter [" + ha + "]");
}
if (ha.supports(handler)) {
return ha;
}
}
}
throw new ServletException("No adapter for handler [" + handler +
"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
在这个方法中,遍历所有的handlerAdapter,在获取当前handler要使用的handlerAdapter的时候,就采用了适配器策略模式,也就是ha.supports(handler) 这行代码
这里可以看到,有多个handlerAdapter的实现类,那怎么判断当前入参的handler,可以使用哪个handlerAdapter呢?就一次遍历,调用其support方法,如果返回TRUE,就认为是可以使用的
如果不这样用,我们要怎么判断?if else if else if 一旦我们增加了一个handlerAdapter的实现类,就需要多加一个if else ,这样是比较麻烦的;通过这种方式,我们只需要实现一个handlerAdapter的实现类,然后把实现类放到list集合中就可以了