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