一、责任链模式介绍
责任链模式(Chain Of Responsibility Design Pattern)。行为型设计模式。
责任链模式通过组合多个处理规则形成链条达到多重过滤的效果。比如:Filter 或 Interceptor
二、责任链模板
2.1、过滤器接口
过滤器接口定义。其中过滤器的执行逻辑在 doFilter方法中。
该接口定义中需要关注另一个接口定义 FilterChain
,相关代码如下:
FilterChain 用来串联所有的 Filter 实现过滤链。
2.2、过滤器实现类
实现过滤器接口 Filter
实现三个过滤器,分别为:FilterA
、FilterB
、FilterC
,如下
2.3、过滤链实现
实现过滤链接口 FilterChain
,实现过滤链 ApplicationFilterChain
,代码如下:
如上述代码,结合 FilterChain
和 Filter
中的 doFilter()
方法,能够知道, 过滤链的形成,是通过 FilterChain
将所有 Filter
连接,而每个 Filter 又持有 FilterChain 实例对象,依次逐个调用 Filter 同时传递 FilterChain 对象,在执行过程中,FilterChain 会遍历持有的 Filter 数组,实现过滤链功能。
2.4、使用案例代码
结合案例代码,整个调用链路执行逻辑,FilterChain#doFilter
调用 Filter#doFilter
,Filter
反过来调用 FilterChain#doFilter
,在 FilterChain
中维护了 Filter
列表或者数组,在此过程中,会切换调用的 Filter
,直到不满足条件过滤链中断,或者过滤链遍历完成。
三、Mybatis 中的责任链
Mybatis 针对 SQL 入参,结果集获取等提供了插件支持,允许在进行 SQL 拼装前,或者获取响应结果集前后进行定制化代码处理。
而处理的逻辑实现,通过过滤器构成责任链的方式来实现。
Mybatis 中的插件以 Interceptor
的方式存在,同时存在过滤链 InterceptorChain
,并以 List
的方式存储所有的 Interceptor
。
以 Executor
为例,来看一下构建 Executor
时,插件过滤链的构建。
首先,先来看一下 Executor
实例化的策略方法,代码如下:
上述代码中,聚焦 interceptorChain.pluginAll
方法,代码如下:
上述代码构建完后的 Executor
对象逻辑图如下:
如上图,构建代理对象,越多的过滤层 Interceptor
,构建的代理对象层次越深,再来看一下 代理对象的 invoke
方法。
如上图所示,代理方法中,直接调用的 Interceptor#interceptor
过滤器方法,多层代理对象,也就是多层的 Interceptor
过滤器,从而形成过滤链。
【公众号】花好夜猿