适配的命名规则通常:XXXAdapter
一、Spring中的适配器模式
基于 SpringBoot 2.1.5 ,默认 springframework 5.1.7
来回顾一下 SpringFramework 中 SpringMVC 模块请求处理图如下,
![[设计模式]-[结构型]-适配器-应用案例 - 图1](/uploads/projects/it-learn@java-base/ad22b3c0e83a4beffe0360637ae44fa4.webp)
来回顾一下适配器的定义:将不兼容的接口转变为兼容,组合多个接口不兼容的类,统一提供功能。
在 SpringMVC 处理流程中的步骤一,会根据请求 URL 获取相应的 Handler 进行处理,这里使用到的就是适配器模式。在 SpringMVC 中,所有请求的入口为:**DispatcherServlet** ,而对于请求资源的处理有,静态资源访问,Restful API 访问,甚至还会有传统 Servlet 的访问,这些请求的处理都各自不同,所以 Spring MVC 通过适配的方式,将不同的请求资源处理,通过统一的接口 **HandlerAdapter**进行规范,并构建各自的适配器,进行适配处理。
HandlerAdapter 提供的几种实现
![[设计模式]-[结构型]-适配器-应用案例 - 图2](/uploads/projects/it-learn@java-base/3bf108ffe2a49f8c83e5e0fb6935acdf.webp)
如图,根据不同场景的处理,排除抽象实现,Spring MVC 提供了四种类型的 Controller 请求处理。
下面通过代码案例,来分别说明这几种 **HandlerAdapter** 的简单处理逻辑。
* 静态资源的处理 Handler
SpringBoot 默认配置了四个静态资源存放路径,当然可以通过自定义的方式取代默认配置。
一个简单的静态资源案例:在静态资源目录static 文件夹中,创建 static.html 静态资源文件
如下
![[设计模式]-[结构型]-适配器-应用案例 - 图3](/uploads/projects/it-learn@java-base/5a1bd2036c8b3b998c75d811069d2e51.webp)
而访问这些静态资源对应的请求,由处理器 HttpRequestHandlerAdapter
进行处理
* 通过 @RestController + @RequestMapping 方式的控制器
@RestController + @RequestMapping 案例代码如下
![[设计模式]-[结构型]-适配器-应用案例 - 图4](/uploads/projects/it-learn@java-base/f4b86e015f5a9fd280759e67bae82979.webp)
上述代码对应的访问请求由处理器 **RequestMappingHandlerAdapter** 进行处理
* 通过实现 Controller 接口或者其子类方式的控制器
案例代码如下
![[设计模式]-[结构型]-适配器-应用案例 - 图5](/uploads/projects/it-learn@java-base/a778629bf0af7fb64f42656793bc0742.webp)
上述代码,访问请求对应的处理器为 **SimpleControllerHandlerAdapter**
* 传统 Servlet 交由 SpringMvc 处理后的 Adapter
案例代码如下
![[设计模式]-[结构型]-适配器-应用案例 - 图6](/uploads/projects/it-learn@java-base/5c402f3d5f7a4038682f6e21999efd74.webp)
该控制器写法对应的处理器 **SimpleServletHandlerAdapter**
SpringMVC 针对旧有的 Servlet ,静态资源,Restful API 都提供了处理。在 DispatcherServlet 的使用过程中使用了适配的方式,将多种不同的处理类,通过统一的接口进行规范,处理
![[设计模式]-[结构型]-适配器-应用案例 - 图7](/uploads/projects/it-learn@java-base/434c982950ed8df3e56815e0ae0b0256.webp)
如上述 DispatcherServlet 中获取 Adapter 的代码所示。匹配适配器,然后使用适配器暴露的统一规范的接口方法进行访问。
该适配方式属于接口适配。
二、Mybatis 中的适配器模式
基于 Mybatis 3.5.5
在任何一个框架中,日志的集成是必不可少的,而日志框架的种类同样也很多,写法也不一样,Mybatis 通过适配器的方式,对不同类型的日志实现提供了统一的接口访问规范。
相关的实现类图如下:
![[设计模式]-[结构型]-适配器-应用案例 - 图8](/uploads/projects/it-learn@java-base/a181fe453154d6b1dff746bbd18b353f.webp)
通过统一的接口规范 Log,实现接口规范的日志实现就是适配器,被适配的就是各种原日志代码实现。
该适配方式属于接口适配。
【公众号】花好夜猿
