开源框架中的责任链模式实践


开源框架中的责任链模式实践

文章插图
一、责任链介绍在GoF 的《设计模式》一书中对责任链模定义的:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求 。将这些接收对象串成一条链 , 并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止或者所有接收对象处理一遍 。
用通俗的话解释在责任链模式中,多个处理器(接收对象)依次处理同一个请求 。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条 。链条上的每个处理器各自承担各自的处理职责,所以叫作责任链模式 。
责任链模式有效地降低了发送和接收者之间的耦合度,增强了系统的可扩展性 。在责任链的模式下不仅能够针对单个处理器对象进行定制升级(每个处理器对象关注各自的任务) , 而且能够对整个责任链的处理器对象的顺序的调整以及增删 。
本文约定:责任链上的接收对象统一称为处理器;本文中介绍的责任链属于GOF定义中责任链的变种即责任链上的所有处理器都会参与任务的处理 。
二、责任链实现责任链模式有多种实现方式 , 从驱动责任链上处理器方式的角度可以分类两类,即责任链驱动 和 责任链处理器自驱动 。
2.1 处理器自驱动// 1、定义抽象类public abstract class AbstractHandler {protected Handler next = null;// 绑定处理器public void setSuccessor(Handler next) {this.next = next;}// 处理器执行操作并驱动下一个处理器public abstract void handle();}// 2、定义处理器Apublic class HandlerA extends AbstractHandler {@Overridepublic void handle() {// do somethingif (next != null) {next.handle();}}}// 3、定义处理器Bpublic class HandlerB extends AbstractHandler {@Overridepublic void handle() {// do somethingif (next != null) {next.handle();}}} // 4、构建责任链并添加处理器public class HandlerChAIn {// 通过链表的形式保存责任链private AbstractHandler head = null;private AbstractHandler tail = null;public void addHandler(AbstractHandler handler) {handler.setSuccessor(null);if (head == null) {head = handler;tail = handler;return;}tail.setSuccessor(handler);tail = handler;}public void handle() {if (head != null) {head.handle();}}} // 5、整体构建责任链添加处理器并进行驱动public class Application {public static void main(String[] args) {// 构建责任链并添加处理器HandlerChain chain = new HandlerChain();chain.addHandler(new HandlerA());chain.addHandler(new HandlerB());// 责任链负责触发chain.handle();}}说明:
  • 责任链上的每个处理器对象维护下一个处理器对象 , 整个责任链的驱动由每个处理器对象自行驱动 。
  • 每个处理器对象Handler中包含下一个处理器对象next的变量,通过链表形式维护责任链的关系 。
2.2 责任链驱动// 1、定义抽象接口public interface IHandler {void doSomething();} // 2、定义处理器Apublic class HandlerA implements IHandler {@Overridepublic void doSomething() {// do something}} // 3、定义处理器Bpublic class HandlerB implements IHandler {@Overridepublic void doSomething() {// do something}} // 4、构建责任链并添加处理器public class HandlerChain {// 通过数组的形式保存处理器private List<IHandler> handlers = new ArrayList<>();public void addHandler(IHandler handler) {handlers.add(handler);}// 由责任链负责遍历所有的处理器并进行调用public void handle() {for (IHandler handler : handlers) {handler.handle();}}} // 5、整体构建责任链添加处理器并进行驱动public class Application {public static void main(String[] args) {HandlerChain chain = new HandlerChain();chain.addHandler(new HandlerA());chain.addHandler(new HandlerB());chain.handle();}}说明:
  • 责任链对象本身以数组的形式维护处理器对象,即上述代码中的handlers。
  • 责任链的处理器的执行由责任链对象循环调用处理器对象驱动,即上述代码中的handle方法 。
三、开源框架中责任链应用责任链低耦合高扩展的特点让它在很多开源的框架中被采用,本文选取了开源框架中的Spring Interceptor、Servlet Filter、Dubbo、Sentinel进行责任链的实现介绍,通过对常用框架中责任链应用的了解能够更好掌握责任链落地并在日常的开发中积极的使用 。
3.1 Spring Interceptor3.1.1 Interceptor介绍
 
开源框架中的责任链模式实践


推荐阅读