适配器模式在springMVC的应用
通过 设计模式之适配器模式一文我们了解了适配器的三种模式以及它的简单实现,本文将简化springMVC的流程来讲述适配器模式的控制器转发实现。
用过springMVC的同志都知道,它的核心代码在于DispatcherServlet类中的doDispatch方法,该方法完成的功能是会根据传入的Controller类型执行相应的方法返回modelView对象。
现在假设我们在第一时间实现这个需求,大多数的程序员会这样实现:
if(mappedHandler.getHandler() instanceof MultiActionController){
((MultiActionController)mappedHandler.getHandler()).xxx
}else if(mappedHandler.getHandler() instanceof XXX){
...
}else if(...){
...
}
这样在代码中出现了大量的if-else逻辑,如果再加一种controller类型就需要修改源码维护成本太高,拓展性几乎没有。因此这种实现方式肯定不可取。spring团队作为大神级别的存在自然不会用这么low的实现方式。那他们是如何实现的呢?
答案是适配器模式,更具体的是对象的适配器模式。下面我就用代码简单的模拟下它的实现逻辑。
定义一个Controller接口
public interface Controller {
}
该接口什么都不干,只是一个标记接口。
定义一个Adapter接口
package com.zte.service.test;
public interface HandlerAdapter {
public boolean supports(Controller handler);
public void handle(Controller handler);
}
supports方法根据传入的controller类型返回是否匹配本实现类。
handle方法处理具体的业务处理逻辑。
定义两个不同的controller实现类
@service
public class HttpHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((HttpController)handler).doHttpHandler();
}
public boolean supports(Object handler) {
return (handler instanceof HttpController);
}
}
@service
public void handle(Object handler) {
((AnnotationController)handler).doAnnotationHandler();
}
public boolean supports(Object handler) {
return (handler instanceof AnnotationController);
}
模拟一个DispatcherServlet
package com.zte.service.test;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DispatchServlet {
@Resource
public List<HandlerAdapter> handlerAdapters;
@RequestMapping("test")
public void doDispatch(){
//此处模拟SpringMVC从request取handler的对象,仅仅new出,可以出,
//不论实现何种Controller,适配器总能经过适配以后得到想要的结果
// HttpController controller = new HttpController();
// AnnotationController controller = new AnnotationController();
SimpleController controller = new SimpleController();
//得到对应适配器
HandlerAdapter adapter = getHandler(controller);
//通过适配器执行对应的controller对应方法
adapter.handle(controller);
}
public HandlerAdapter getHandler(Controller controller){
for(HandlerAdapter adapter: this.handlerAdapters){
if(adapter.supports(controller)){
return adapter;
}
}
return null;
}
}
至此一个简单的springmvc转发中心模拟完毕。本文仅仅为了简介下适配器的简单应用和实际的代码实现有很大的区别,请勿当初springmvc的实现原理。