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

作者: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(); }}阐明: ...

September 21, 2023 · 9 min · jiezi

关于责任链模式:一文带你读懂设计模式之责任链模式-京东云技术团队

1.前言emm,翻了一下之前刚入职时候的学习笔记,发现之前在熟悉业务代码的时候已经专门学习并整顿过过设计模式中的责任链模式,之前只是对其简略理解过罕用的设计模式有哪些,并未联合实例和源码深刻对其探索,利用相熟代码契机进行零碎学习并整顿文档如下。 2.什么是责任链模式?俗话说没有规矩不成方圆,咱们无论在工作还是生存中很多事件都须要依照规定的流程办事,这样的流程往往都是环环相扣的,上一部实现之后才会流转到下一步执行。比方咱们在做饭时都是先买菜、洗菜、切菜、炒菜、装盘在这样的过程中只有上一步实现之后能力开始下一步最初失去一道做好的菜;又比方在降职提名时,首先咱们要做一个述职报告进行述职,而后就是评审小组打分,评审小组筛选通过后,流转到项目组领导处审批,项目组领导依据述职报告和评审小组分数决定是否降职,项目组领导批准之后最初流转到部门领导审批并给出最初后果。像这种一步一步实现流程都能够通过责任链模式来实现。 简介: 责任链模式顾名思义是将不同职责的步骤串联起来执行,并且一个步骤执行实现之后才可能执行下一个步骤。从名字能够看出通常责任链模式应用链表来实现。因而当执行工作的申请发动时,从责任链上第一步开始往下传递,直到最初一个步骤实现。在责任链模式当中,客户端只用执行一次流程开始的申请便不再须要参加到流程执行当中,责任链上的流程便可能本人始终往下执行,客户端同样也并不关怀执行流程细节,从而实现与流程之间的解耦。 模式构造:责任链模式次要角色如下: ◦形象处理器(Handler):处理器形象接口,定义了解决申请的办法和执行下一步解决的处理器。 ◦具体处理器(ConcreteHandler):执行申请的具体实现,先依据申请执行解决逻辑,实现之后将申请交给下一个处理器执行。 ◦调用者:调用者通过创立处理器并将申请交给处理器进行解决。 相干代码:// 形象处理器public abstract class Handler { private Handler next; public Handler getNext() { return next; } public void setNext(Handler next) { this.next = next; } public abstract void handle(Object request);}// 具体处理器 1public class ConcreteHandler1 extends Handler { @Override public void handle(Object request) { System.out.println("concrete handler 1 execute request. request: " + request); if (getNext() != null) { getNext().handle(request); } }}// 具体处理器 2public class ConcreteHandler2 extends Handler { @Override public void handle(Object request) { System.out.println("concrete handler 2 execute request. request: " + request); if (getNext() != null){ getNext().handle(request); } }}// 具体处理器 3public class ConcreteHandler3 extends Handler { @Override public void handle(Object request) { System.out.println("concrete handler 3 execute request. request: " + request); if (getNext() != null) { getNext().handle(request); } }}public static void main(String[] args) { Handler concreteHandler1 = new ConcreteHandler1(); Handler concreteHandler2 = new ConcreteHandler2(); Handler concreteHandler3 = new ConcreteHandler3(); concreteHandler1.setNext(concreteHandler2); concreteHandler2.setNext(concreteHandler3); concreteHandler1.handle("my request.");}从下面的代码咱们能够看到其实责任链模式是非常简单的,然而其中有几个点须要留神一下: ...

August 18, 2023 · 5 min · jiezi

关于责任链模式:设计模式之责任链模式

本文通过图书馆管理系统中,用户名校验、明码校验、须要减少问题,每次都要减少if判断语句,将其改用责任链模式进行链式调用,为了让代码更加的优雅,咱们应用之前学过的建造者模式就代码进行革新。接着咱们会介绍责任链模式在咱们罕用的框架中的使用,最初是责任链模式的优缺点和利用场景。 读者能够拉取残缺代码到本地进行学习,实现代码均测试通过后上传到码云。 一、引出问题小王给老王打造了一套图书馆管理系统,随着访问量的一直减少,老王要求减少拜访的用户名校验。 小王说这有何难,说着就在用户拜访图书馆之前加了一层判断语句,判断用户名是否非法。过了一段时间后,又给每个用户颁发了一个明码,就须要在用户名校验通过当前校验明码。 小王就筹备在用户名的判断语句后,减少明码的校验语句。老王赶紧拦住了要持续更改代码的小王。如果当前再减少角色校验、权限校验、你筹备写多少个判断语句。 而且你把软件设计准则中的——开闭准则丢到哪里去了。 你能够思考应用一种模式,将所有的校验办法都独立进去一个类,每一个类只负责解决各自的校验逻辑,以后的校验类通过当前传递给下一个校验类进行解决,这样每次减少新的逻辑判断都只须要减少校验类就行了。 就像是一条流水线,每个类负责解决线上的一个环节。 二、责任链模式的概念和应用实际上,老王提出来的正是行为型设计模式中的——*责任链模式*。 责任链模式正如它的名字一样,将每个职责的步骤串联起来执行,并且一个步骤执行实现之后才可能执行下一个步骤。 从名字能够看出通常责任链模式应用链表来实现。 因而当执行工作的申请发动时,从责任链上第一步开始往下传递,直到最初一个步骤实现。 在责任链模式当中, 客户端只用执行一次流程开始的申请便不再须要参加到流程执行当中,责任链上的流程便可能本人始终往下执行, 客户端同样也并不关怀执行流程细节,从而实现与流程之间的解耦。 责任链模式须要有两个角色: 形象处理器(Handler):处理器形象接口,定义了解决申请的办法和执行下一步解决的处理器。 具体处理器(ConcreteHandler):执行申请的具体实现,先依据申请执行解决逻辑,实现之后将申请交给下一个处理器执行。 基于责任链模式实现图书馆的用户名校验和明码校验。 形象处理器: /** * @author tcy * @Date 22-08-2022 */public abstract class Handler { private Handler next; public Handler getNext() { return next; } public void setNext(Handler next) { this.next = next; } public abstract void handle(Object request);}用户名校验处理器: /** * @author tcy * @Date 23-08-2022 */public class ConcreteHandlerUsername extends Handler{ @Override public void handle(Object request) { //相应的业务逻辑... System.out.println("用户名校验通过. 参数: " + request); //调用链路中下一个节点的解决办法 if (getNext() != null) { getNext().handle(request); } }}明码校验器: ...

August 24, 2022 · 3 min · jiezi