责任链模式的定义: 使多个对象都有机会处理请求, 从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链, 并沿着这条链传递该请求, 直到有一个对象处理他为止. 这里就不再过多的介绍什么是责任链模式, 主要来说说 java 中如何编写. 主要从下面 3 个框架中的代码中介绍.
servlet 中的 filter
dubbo 中的 filter
mybatis 中的 plugin
servlet 中的 Filter
servlet 中分别定义了一个 Filter 和 FilterChain 的接口, 核心代码如下:
代码还算简单, 结构也比较清晰, 定义一个 Chain, 里面包含了 Filter 列表和 servlet, 达到在调用真正 servlet 之前进行各种 filter 逻辑.
Dubbo 中的 Filter
Dubbo 在创建 Filter 的时候是另外一个方法, 通过把 Filter 封装成 Invoker 的匿名类, 通过链表这样的数据结构来完成责任链, 核心代码如下:
Dubbo 的责任链就没有类似 FilterChain 这样的类吧 Filter 和调用 Invoker 结合起来, 而是通过创建一个链表, 调用的时候我们只知道第一个节点, 每个节点包含了下一个调用的节点信息. 这里的虽然 Invoker 封装 Filter 没有显示的指定 next, 但是通过 java 匿名类和 final 的机制达到同样的效果.
Mybatis 中的 Plugin
Mybatis 可以配置各种 Plugin, 无论是官方提供的还是自己定义的, Plugin 和 Filter 类似, 就在执行 Sql 语句的时候做一些操作. Mybatis 的责任链则是通过动态代理的方式, 使用 Plugin 代理实际的 Executor 类.(这里实际还使用了组合模式, 因为 Plugin 可以嵌套代理), 核心代码如下:
简单的示意图如下:
总结
这里简单介绍了 Servlet,Dubbo,Mybatis 对责任链模式的不同实现手段, 其中 Servlet 是相对比较清晰, 又易于实现的方式, 而 Dubbo 和 Mybatis 则适合在原有代码基础上, 增加责任链模式代码改动量最小的. https://dwz.cn/1TtgW7Ud
来源: http://www.bubuko.com/infodetail-3092509.html