DispatcherServlet -> HandlerMapping(得到处理器链) -> HandlerAdapter(处理器适配器) -> Handler(处理器) -> ViewAndResolver(视图解析器) -> 模板等返回给浏览器
简单实现DispatcherServlet中的适配器
UML类图
代码实现
// 处理器适配器接口及实现类 public interface MyHandlerAdapter { // 处理器适配器 判断是那种适配器 boolean support(Object object); // 通过适配器执行处理器中的方法 void handler(Object object); } class MyHttpRequestHandlerAdapter implements MyHandlerAdapter{ @Override public boolean support(Object object) { return object instanceof MyHttpRequestHandler; } @Override public void handler(Object object) { MyHttpRequestHandler myHttpRequestHandler = (MyHttpRequestHandler) object; myHttpRequestHandler.doHttpRequest(); } } class MySimpleControllerHandlerAdapter implements MyHandlerAdapter{ @Override public boolean support(Object object) { return object instanceof MySimpleControllerHandler; } @Override public void handler(Object object) { MySimpleControllerHandler mySimpleControllerHandler = (MySimpleControllerHandler) object; mySimpleControllerHandler.doSimpleController(); } } class MySimpleServletHandlerAdapter implements MyHandlerAdapter{ @Override public boolean support(Object object) { return object instanceof MySimpleServletHandlerAdapter; } @Override public void handler(Object object) { MySimpleServletHandler mySimpleServletHandler = (MySimpleServletHandler) object; mySimpleServletHandler.doSimpleServlet(); } }
// 处理器接口及实现类 public interface MyHandler { // 处理器接口 } class MyHttpRequestHandler implements MyHandler { public void doHttpRequest() { System.out.println("doHttpRequest..."); } } class MySimpleControllerHandler implements MyHandler { public void doSimpleController() { System.out.println("doSimpleController..."); } } class MySimpleServletHandler implements MyHandler { public void doSimpleServlet() { System.out.println("doSimpleServlet..."); } }
public class MyDispatcherServlet { // 进行spring mvc中DispatcherServlet的简单实现 private static List<MyHandlerAdapter> myHandlerAdapters = new ArrayList<>(); public MyDispatcherServlet() { myHandlerAdapters.add(new MyHttpRequestHandlerAdapter()); myHandlerAdapters.add(new MySimpleControllerHandlerAdapter()); myHandlerAdapters.add(new MySimpleServletHandlerAdapter()); } public void doDispatcher(String request) { // 实际执行流程 DispatcherServlet -> HandlerMapping(得到处理器链) -> HandlerAdapter(处理器适配器) -> Handler(处理器) -> ViewAndResolver(视图解析器) -> 模板等返回 // 实际 通过HttpServletRequest对象获取的Handler对象 此处简化即可 MyHttpRequestHandler myHttpRequestHandler = new MyHttpRequestHandler(); MyHandlerAdapter handlerAdapter = getHandlerAdapter(myHttpRequestHandler); // 通过获取到的HandlerAdapter对象来执行指定种类Handler的方法 // 不同的HandlerAdapter执行Handler的方法的方式不一样 // 感觉相当于将Handle对象分成了多类,每类通过自己的HandlerAdapter执行Handler对象中的处理方法,这样每类的执行方式都一样 handlerAdapter.handler(myHttpRequestHandler); } /** * 通过Handler获取对应的HandlerAdapter进行适配 * @param myHandler * @return */ public MyHandlerAdapter getHandlerAdapter(MyHandler myHandler) { if (null != this.myHandlerAdapters) { for (MyHandlerAdapter myHandlerAdapter : myHandlerAdapters) { if (myHandlerAdapter.support(myHandler)) { return myHandlerAdapter; } } } throw new RuntimeException("该Handler没有对应的HandlerAdapter"); } public static void main(String[] args) { MyDispatcherServlet myDispatcherServlet = new MyDispatcherServlet(); myDispatcherServlet.doDispatcher("url"); } }
注意事项:三种命名方式,是根据src是以怎样的形式给到Adapter(在 Adapter 里的形式)来命名的
类适配器:以类给到,在Adapter里,就是将src当做类,继承
对象适配器:以对象给到,在Adapter里,将src作为一个对象,持有
接口适配器:以接口给到,在Adapter里,将src作为一个接口,实现
Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作
实际开发中,实现起来不拘泥于我们讲解的三种经典形式