Spring框架中设计模式之 适配器模式

在 Spring 中,适配器模式主要应用在 Spring MVC 中的 HandlerAdapter 和 ViewResolver 接口中。Spring MVC 是一个基于 Servlet API 的 Web 框架,它的核心是 DispatcherServlet。当 DispatcherServlet 接收到一个 HTTP 请求时,它会通过 HandlerMapping 找到对应的 Controller,然后通过 HandlerAdapter 调用 Controller 的处理方法,最后通过 ViewResolver 渲染视图并返回响应。

HandlerAdapter 接口定义了一个 handle 方法,用于处理 Controller 的请求。不同类型的 Controller 可能有不同的处理方式,因此 Spring 提供了多个 HandlerAdapter 的实现类,如 SimpleControllerHandlerAdapter、HttpRequestHandlerAdapter、AnnotationMethodHandlerAdapter 等。这些实现类就是适配器,将 Controller 的处理方式适配到 handle 方法中。

下面是一个使用适配器模式的示例代码:

public interface Controller {
    ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

public class SimpleController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView("simple");
        mav.addObject("message", "Hello, World!");
        return mav;
    }
}

public class SimpleControllerHandlerAdapter implements HandlerAdapter {
    @Override
    public boolean supports(Object handler) {
        return (handler instanceof SimpleController);
    }

    @Override
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return ((SimpleController) handler).handleRequest(request, response);
    }

    @Override
    public long getLastModified(HttpServletRequest request, Object handler) {
        return -1;
    }
}

public static void main(String[] args) throws Exception {
    SimpleController controller = new SimpleController();
    SimpleControllerHandlerAdapter adapter = new SimpleControllerHandlerAdapter();
    MockHttpServletRequest request = new MockHttpServletRequest();
    MockHttpServletResponse response = new MockHttpServletResponse();
    ModelAndView mav = adapter.handle(request, response, controller);
    System.out.println(mav.getViewName());
    System.out.println(mav.getModel().get("message"));
}

在上面的代码中,Controller 是一个处理请求的接口,SimpleController 是其一个实现类。SimpleControllerHandlerAdapter 实现了 HandlerAdapter 接口,并将 SimpleController 的处理方式适配到 handle 方法中。在 main 方法中,我们创建了一个 SimpleController 和一个 SimpleControllerHandlerAdapter,并通过 MockHttpServletRequest 和 MockHttpServletResponse 来模拟 HTTP 请求和响应,最后调用了 SimpleController 的 handleRequest 方法来处理请求,并输出了视图名称和消息内容。

在 Spring MVC 中,ViewResolver 接口也使用了适配器模式。ViewResolver 用于将逻辑视图名称解析为实际的视图,不同类型的视图可能有不同的解析方式,因此 Spring 提供了多个 ViewResolver 的实现类,如 InternalResourceViewResolver、FreeMarkerViewResolver、TilesViewResolver 等。这些实现类就是适配器,将视图的解析方式适配到 resolveViewName 方法中。