设计模式-简单Demo掌握责任链模式

news/2024/10/18 9:18:45/

文章目录

    • 1、要点
    • 2、Demo
    • 3、进阶掌握

参考文章:

基本原理:责任链模式 | 菜鸟教程 (runoob.com)

简单例子:五分钟学设计模式.12.责任链模式_哔哩哔哩_bilibili

阿里巴巴的应用:责任链模式在复杂数据处理场景中的实战

责任链模式(Chain of Responsibility Pattern)指的是为请求创建了一个处理对象的链。这种模式将请求者和处理者进行解耦,请求者不需要知道谁去处理,处理者也不需要知道请求的全貌。这种类型的设计模式属于行为型模式

在这种模式中,通常每个处理者都包含对另一个处理者的引用。如果一个链上的处理者不能处理该请求,那么它会把相同的请求传给下一个处理者,依此类推。

1、要点

意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

何时使用:在处理消息的时候以过滤很多道。

如何解决:链上的处理类都继承同一抽象类,同时能够通过构造函数或者set设置下一个处理节点。

应用实例: 1、红楼梦中的"击鼓传花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。

优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。

缺点: 1、系统性能将受到一定影响,每次都需要从链头走到链尾。 2、在进行代码调试时不太方便,采取类似递归的方式,查错较难。3、可能会造成循环调用

使用场景: 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、可动态指定一组对象处理请求。

**注意事项:**在 JAVA WEB 中遇到很多应用。

2、Demo

现在要实现一个请假审批请求的流程,依次需要经过 班长 - 辅导员 - 校长的审批。

实现要点:需要定义一个总抽象类Handler,规定责任链上的处理节点的结构,该类中还需要有下一个节点设置方法(这里采用set设置),处理方法process()根据规则判断在当前节点处理,还是传递给下一个节点。

  1. 定义链节点抽象类

    /*** @Author jiangxuzhao* @Description 定义链节点抽象类* @Date 2023/5/22*/
    public abstract class Handler {protected Handler nextHandler;public void setNextHandler(Handler nextHandler){this.nextHandler=nextHandler;}// 根据紧急程度urgentDegree传递请求requestpublic abstract void process(Integer urgentDegree, String request);
    }
    
  2. 定义具体的链节点

    /*** @Author jiangxuzhao* @Description 班长责任节点* @Date 2023/5/22*/
    public class ClassMonitor extends Handler{@Overridepublic void process(Integer urgentDegree, String request) {if(urgentDegree>=0&&urgentDegree<10){System.out.println("班长审批了: ");}else{System.out.println("班长没法审批,传下去...");nextHandler.process(urgentDegree,request);}}
    }
    
    /*** @Author jiangxuzhao* @Description 辅导员责任节点* @Date 2023/5/22*/
    public class Counsellor extends Handler{@Overridepublic void process(Integer urgentDegree, String request) {if(urgentDegree>=10&&urgentDegree<20){System.out.println("辅导员审批了: "+request);}else{System.out.println("辅导员没法审批,传下去...");nextHandler.process(urgentDegree, request);}}
    }
    
    /*** @Author jiangxuzhao* @Description 校长责任节点* @Date 2023/5/22*/
    public class SchoolMaster extends Handler{@Overridepublic void process(Integer urgentDegree, String request) {System.out.println("终极一站,校长审批了: "+request);}
    }
    
  3. 测试,需要自己先设置好责任链,一次设置,多次调用

    import org.junit.Test;/*** @Author jiangxuzhao* @Description* @Date 2023/5/22*/
    public class TestResponsibilityChain {@Testpublic void testChain(){// 创建责任链节点Handler level1 = new ClassMonitor();Handler level2 = new Counsellor();Handler level3 = new SchoolMaster();// 设置责任链level1.setNextHandler(level2);level2.setNextHandler(level3);// 测试,从第一个节点传入请求level1.process(15,"出去上网");System.out.println();level1.process(100,"出去看病");}
    }
    

    输出:
    在这里插入图片描述

3、进阶掌握

在理解了原理之后,更高阶的实际应用可以参考阿里巴巴的技术文章责任链模式在复杂数据处理场景中的实战


http://www.ppmy.cn/news/86558.html

相关文章

森林大侠

树林里有一棵生了病的大树&#xff0c;无精打采&#xff0c;眉头紧锁&#xff0c;低垂着头&#xff0c;眼睛里不停地落下哀伤的泪水。它的叶子&#xff0c;从枯黄&#xff0c;到枯萎&#xff0c;再到纷纷落下&#xff0c;好像已经生病了很久。 一只啄木鸟正好从树林的上空飞过&…

离散数学_十章-图 ( 2 ):图的术语和几种特殊的图

&#x1f4f7;10.2 图的术语和几种特殊的图 1. 基本术语1.1 邻接&#xff08;相邻&#xff09;1.2 邻居1.3 顶点的度1.4 孤立点1.5 悬挂点例题 2. 握手定理3. 握手定理的推论4. 带有有向边的图的术语4.1 邻接4.2 度——出度 和 入度4.3 例题&#xff1a; 5. 定理&#xff1a;入…

基于redis客户端缓存机制实现本地缓存

文章目录 前言一、本地缓存和分布式缓存二、redis客户端缓存机制1.客户端缓存实现原理普通模式广播模式重定向模式redirect 2.优势和误区3.客户端缓存机制请求流程 三、项目实战1.引入依赖2.redis连接属性配置3.开启客户端缓存4.使用本地缓存5.测试 总结 前言 采用缓存一直是我…

ChatGPT实战100例 - (11) 零成本学习Python

文章目录 ChatGPT实战100例 - (11) 零成本学习Python一、需求与思路二、培训大纲三、开始秀四、Python 简介1、Python 的发展历史2、Python 的特点与优势3、 Python 的应用领域四、 总结ChatGPT实战100例 - (11) 零成本学习Python 一、需求与思路 用ChatGPT列一个培训大纲, …

手写红黑树

基于C构造一个红黑树 参考代码一&#xff1a; 以下是一个简单的C实现&#xff0c;展示了如何手写一个红黑树&#xff1a; #include <iostream>using namespace std;// 节点结构体 struct Node {int val;bool isRed;Node* left;Node* right;Node(int v):val(v), isRed(…

代码调试技巧

目录 1.为什么要进行调试&#xff1f; 2.调试的基本步骤 3.关于Debug版本和Release版本 4.调试技巧 5.调试总结 我还是喜欢真实的世界&#xff0c;因为在那里&#xff0c;我可以通过自己的努力来改变残酷的现实 本专栏适用于有一定C语言基础并且还要继续学习的人 往期…

内蒙古棒球的未来发展路线·棒球1号位

内蒙古作为中国的一个省级行政区&#xff0c;棒球运动在该地区逐渐兴起。为了促进棒球运动的发展&#xff0c;可以考虑以下规划&#xff1a; 1. 加强教学培训&#xff1a;组织专业的教练组成教师队伍&#xff0c;进行专业的教学和训练&#xff0c;提升运动员基本技能和素质。 2…

C语言-printf打印%*s、%.*s与%-.*s的区别

一、简介 在平时的使用中&#xff0c;会经常使用到printf进行打印&#xff0c;而最长使用的方式是printf("%s",string)进行打印。但是有个问题&#xff0c;如果string结尾不是0。那么printf会继续打印&#xff0c;直到遇到0为止。这样就会有内存溢出的风险。显然&…