适配的命名规则通常:XXXAdapter

一、Spring中的适配器模式

基于 SpringBoot 2.1.5 ,默认 springframework 5.1.7
来回顾一下 SpringFramework 中 SpringMVC 模块请求处理图如下,

[设计模式]-[结构型]-适配器-应用案例 - 图1

来回顾一下适配器的定义:将不兼容的接口转变为兼容,组合多个接口不兼容的类,统一提供功能。

在 SpringMVC 处理流程中的步骤一,会根据请求 URL 获取相应的 Handler 进行处理,这里使用到的就是适配器模式。在 SpringMVC 中,所有请求的入口为:**DispatcherServlet** ,而对于请求资源的处理有,静态资源访问Restful API 访问,甚至还会有传统 Servlet 的访问,这些请求的处理都各自不同,所以 Spring MVC 通过适配的方式,将不同的请求资源处理,通过统一的接口 **HandlerAdapter**进行规范,并构建各自的适配器,进行适配处理。

HandlerAdapter 提供的几种实现

[设计模式]-[结构型]-适配器-应用案例 - 图2

如图,根据不同场景的处理,排除抽象实现,Spring MVC 提供了四种类型的 Controller 请求处理。

下面通过代码案例,来分别说明这几种 **HandlerAdapter** 的简单处理逻辑。

* 静态资源的处理 Handler

SpringBoot 默认配置了四个静态资源存放路径,当然可以通过自定义的方式取代默认配置。

一个简单的静态资源案例:在静态资源目录static 文件夹中,创建 static.html 静态资源文件

如下

[设计模式]-[结构型]-适配器-应用案例 - 图3

而访问这些静态资源对应的请求,由处理器 HttpRequestHandlerAdapter
进行处理

* 通过 @RestController + @RequestMapping 方式的控制器

@RestController + @RequestMapping 案例代码如下

[设计模式]-[结构型]-适配器-应用案例 - 图4

上述代码对应的访问请求由处理器 **RequestMappingHandlerAdapter** 进行处理

* 通过实现 Controller 接口或者其子类方式的控制器

案例代码如下

[设计模式]-[结构型]-适配器-应用案例 - 图5

上述代码,访问请求对应的处理器为 **SimpleControllerHandlerAdapter**

* 传统 Servlet 交由 SpringMvc 处理后的 Adapter

案例代码如下

[设计模式]-[结构型]-适配器-应用案例 - 图6

该控制器写法对应的处理器 **SimpleServletHandlerAdapter**

SpringMVC 针对旧有的 Servlet ,静态资源,Restful API 都提供了处理。在 DispatcherServlet 的使用过程中使用了适配的方式,将多种不同的处理类,通过统一的接口进行规范,处理

[设计模式]-[结构型]-适配器-应用案例 - 图7

如上述 DispatcherServlet 中获取 Adapter 的代码所示。匹配适配器,然后使用适配器暴露的统一规范的接口方法进行访问。
该适配方式属于接口适配。

二、Mybatis 中的适配器模式

基于 Mybatis 3.5.5

在任何一个框架中,日志的集成是必不可少的,而日志框架的种类同样也很多,写法也不一样,Mybatis 通过适配器的方式,对不同类型的日志实现提供了统一的接口访问规范。

相关的实现类图如下:

[设计模式]-[结构型]-适配器-应用案例 - 图8

通过统一的接口规范 Log,实现接口规范的日志实现就是适配器,被适配的就是各种原日志代码实现。
该适配方式属于接口适配。


【公众号】花好夜猿
wxlogo.jpg