一、责任链模式介绍

责任链模式(Chain Of Responsibility Design Pattern)。行为型设计模式。
责任链模式通过组合多个处理规则形成链条达到多重过滤的效果。比如:Filter 或 Interceptor

二、责任链模板

常见:Filter 过滤器实现。

2.1、过滤器接口

[设计模式]-[行为型]-责任链-介绍及应用 - 图1
过滤器接口定义。其中过滤器的执行逻辑在 doFilter方法中。
该接口定义中需要关注另一个接口定义 FilterChain,相关代码如下:
[设计模式]-[行为型]-责任链-介绍及应用 - 图2
FilterChain 用来串联所有的 Filter 实现过滤链。
2.2、过滤器实现类
实现过滤器接口 Filter 实现三个过滤器,分别为:FilterAFilterBFilterC,如下
[设计模式]-[行为型]-责任链-介绍及应用 - 图3

2.3、过滤链实现

实现过滤链接口 FilterChain,实现过滤链 ApplicationFilterChain,代码如下:
[设计模式]-[行为型]-责任链-介绍及应用 - 图4
如上述代码,结合 FilterChainFilter 中的 doFilter() 方法,能够知道, 过滤链的形成,是通过 FilterChain 将所有 Filter 连接,而每个 Filter 又持有 FilterChain 实例对象,依次逐个调用 Filter 同时传递 FilterChain 对象,在执行过程中,FilterChain 会遍历持有的 Filter 数组,实现过滤链功能。

2.4、使用案例代码

[设计模式]-[行为型]-责任链-介绍及应用 - 图5
结合案例代码,整个调用链路执行逻辑,FilterChain#doFilter 调用 Filter#doFilterFilter 反过来调用 FilterChain#doFilter ,在 FilterChain 中维护了 Filter 列表或者数组,在此过程中,会切换调用的 Filter,直到不满足条件过滤链中断,或者过滤链遍历完成。

三、Mybatis 中的责任链

Mybatis 针对 SQL 入参,结果集获取等提供了插件支持,允许在进行 SQL 拼装前,或者获取响应结果集前后进行定制化代码处理。
而处理的逻辑实现,通过过滤器构成责任链的方式来实现。
Mybatis 中的插件以 Interceptor 的方式存在,同时存在过滤链 InterceptorChain ,并以 List 的方式存储所有的 Interceptor
Executor 为例,来看一下构建 Executor 时,插件过滤链的构建。
首先,先来看一下 Executor 实例化的策略方法,代码如下:
[设计模式]-[行为型]-责任链-介绍及应用 - 图6
上述代码中,聚焦 interceptorChain.pluginAll 方法,代码如下:
[设计模式]-[行为型]-责任链-介绍及应用 - 图7
上述代码构建完后的 Executor 对象逻辑图如下:

[设计模式]-[行为型]-责任链-介绍及应用 - 图8
如上图,构建代理对象,越多的过滤层 Interceptor ,构建的代理对象层次越深,再来看一下 代理对象的 invoke 方法。
[设计模式]-[行为型]-责任链-介绍及应用 - 图9
如上图所示,代理方法中,直接调用的 Interceptor#interceptor 过滤器方法,多层代理对象,也就是多层的 Interceptor 过滤器,从而形成过滤链。


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