关于责任链模式:开源框架中的责任链模式实践
作者:vivo 互联网服务器团队-Wang Zhi责任链模式作为罕用的设计模式而被大家熟知和应用。本文介绍责任链的常见实现形式,并联合开源框架如Dubbo、Sentinel等进行延长探讨。 一、责任链介绍在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 { @Override public void handle() { // do something if (next != null) { next.handle(); } }} // 3、定义处理器Bpublic class HandlerB extends AbstractHandler { @Override public void handle() { // do something if (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(); }}阐明: ...