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

news2025/1/20 19:15:47

文章目录

    • 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传递请求request
        public abstract void process(Integer urgentDegree, String request);
    }
    
  2. 定义具体的链节点

    /**
     * @Author jiangxuzhao
     * @Description 班长责任节点
     * @Date 2023/5/22
     */
    public class ClassMonitor extends Handler{
    
        @Override
        public 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{
        @Override
        public 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{
        @Override
        public 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 {
        @Test
        public 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.coloradmin.cn/o/555983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-python_6_0_

Python——一门强大的编程语言 Python是现今最流行的编程语言之一&#xff0c;广泛应用于Web开发、数据分析、人工智能等领域&#xff0c;优雅简洁的语法和强大的库使得Python成为很多开发者的首选语言。 Python的优点 易学易用 作为一门动态类型的语言&#xff0c;Python的…

由浅入深Dubbo核心源码剖析SpringBoot整合使用

目录 1 Dubbo与SpringBoot的整合2 公用RPC接口工程3. 服务端工程4. 消费端工程5. 工程调用验证 1 Dubbo与SpringBoot的整合 基于Zookeeper实现Dubbo与Spring Boot的集成整合,依赖导入 <properties><dubbo-version>2.7.8</dubbo-version><spring-boot.vers…

CMake初学笔记(一)

CMake初学笔记&#xff08;一&#xff09; CMake是什么CMake怎么实现跨平台CMake具体实践过程CMakeLists.txt编写快速入门常见函数例子 CMake是什么 跨平台编译工具&#xff0c;为了实现“write once, run everywhere”。 CMake怎么实现跨平台 开发者编写与平台无关的编译过…

opencv_c++学习(十八)

一、连通域分析 连通域分割原理&#xff1a; 邻域分为4邻域和8邻域。如上图所示。当使用连通域分割方法时&#xff0c;需要首先将图像进行二值化处理&#xff0c;在进行连通域的处理。右图为连通域分割两遍法的一个示意图&#xff0c;具体原理可以自行查询&#xff0c;这里只…

零基础学网络安全/web安全,一般人还真学不会

零基础学网络安全能不能学的会&#xff1f; 首先&#xff0c;肯定是可以学会的。 &#xff1f; 是不是和标题不一样&#xff1f;听我继续说 不过&#xff0c;难度会比有一些编程或者网络基础的人大一些。 网络安全需要天分努力才能成就大佬。而且&#xff0c;天分占比远比…

基于springboot+mybatis+mysql+vue学生选课管理系统

基于springbootmybatismysqlvue学生选课管理系统 一、系统介绍二、功能展示1.用户登陆2.课程列表(学生)3.选课(学生)4.查询成绩(学生)5.我的课程&#xff08;老师&#xff09;6.主页&#xff08;老师&#xff09;7.开设课程&#xff08;老师&#xff09;8.成绩管理&#xff08;…

七、jdbcTemplate

一、JdbcTemplate(概念和准备) 1.什么是JdbcTemplate Spring框架对JDBC进行封装&#xff0c;使用JdbcTemplate方便对数据库操作 2.准备工作 引入相关的jar包 在spring配置文件配置数据库连接池 <!--数据库连接池--> <bean id"dataSource" class"c…

图像处理:灰度图片线性截断拉伸

1. 为什么要拉伸 很多时候&#xff0c;灰度图片的灰度级较大&#xff0c;而像素值的分布比较集中&#xff0c;这就导致灰度级的利用率过低&#xff0c;从而导致图片的对比度很小&#xff0c;人眼的感官体验很不好&#xff0c;因此我们通常需要对原始的图像数据进行拉伸调整&…

​数据库原理及应用上机(实验六 视图的定义和维护)

✨作者&#xff1a;命运之光 ✨专栏&#xff1a;数据库原理及应用上机实验 ​ 目录 ✨一、实验目的和要求 ✨二、实验内容 ✨三、实验结果 ✨四&#xff0e;实验总结 &#x1f353;&#x1f353;前言&#xff1a; 数据库原理及应用上机实验报告的一个简单整理后期还会不断…

小白漂流记(如何自学网络安全?)

一、前言&#xff08;关于我&#xff09; 我算是“入行”不久的一个新人安全工作者&#xff0c;为什么是引号呢&#xff0c;因为我是个“半个野路子”出身。早在13年的时候&#xff0c;我在初中时期就已经在90sec、wooyun等社区一直学习、报告漏洞。后来由于升学的压力&#xf…

【Python入门篇】——Python中循环语句(for循环的嵌套应用)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

普洱突围“春茶江湖”,抖音电商「春茶普洱季」解锁好茶生意新增量

“越沉越香”&#xff0c;是普洱茶鲜明的味道符号。国内普洱茶市场热自2000年左右兴起&#xff0c;并逐渐在春茶市场上占据重要的一席之地。为顺应春茶季节打造“普洱爆品”&#xff0c;实现生意的应季增长&#xff0c;抖音电商也为品牌商家提供了更为完善的营销与经营解法。 …

极米科技发布新一代光源技术,投影行业要变天?

作者&#xff1a;坚白 2018年以来&#xff0c;在年轻人群的追捧下&#xff0c;此前主要应用于商用场景的投影仪&#xff0c;逐渐切换到家用场景&#xff0c;而且随着投影技术的持续改进&#xff0c;投影效果也不断提升&#xff0c;家用投影市场进入高速发展期。 但进入2022年…

微信小程序组件设计规范分享

WeUI是一套与微信原生视觉体验一致的基本样式库。微信官方设计团队为微信网页和微信小程序量身定制设计&#xff0c;使用户感知更加统一&#xff0c;包括button、cell、dialog、progress、toast、article、actionsheet、微信weui开发团队可以直接使用icon等各种元素。下面资源社…

基于postman测试接口(整套接口测试)(附视频教程加源码)

目录 可以解决的问题 开启控制台 单个测试尝试 使用请求结果当参数 打印结果(JSON) 自定义可视化结果 随机参数 测试用例连接 一键测试接口集合 从swagger导入接口 自定义全局变量 可以解决的问题 几百个接口人工测试接口过于繁杂大多测试无法使用请求结果当参数可以…

(转载)从0开始学matlab(第12天)—选择语句(if、switch、try/catch)

选择结构可以使 MATLAB 选择性执行指定区域内的代码 ( 称之为语句块 blocks)&#xff0c;而跳过其他区域的代码。选择结构在 MATLAB 中有三种具体的形式 :if 结构&#xff0c; switch 结构和try/catch 结构。 1 if 结构 1.1if语句的基本形式 if 结构的基本形式如下: 其…

菜鸡shader:L3三色环境光材质、阴影及光衰

三色环境光材质 先放上最终效果这里将环境光分为上中下三层&#xff0c;顶层是红色的&#xff0c;中间那层是绿色的&#xff0c;下层则是蓝色的。环境光遮蔽效果则是直接采样事先准备好的AO贴图。 首先是上层环境光&#xff1a; 这里我们只需要法线向量的第二个分量&#xf…

casbin基于RBAC模型实现权限管理

在casbin中权限都是基于匹配规则和访问控制模型实现的&#xff0c;除了上一章的ACL的实现方式&#xff0c;还有一个常用的访问控制模型RBAC。该模型带上了用户角色&#xff0c;基本满足大多数角色管理的系统。 在RBAC模型中多了一个角色的策略机制&#xff0c;其访问模型规则如…

消息中间件 - RabbitMQ篇之入门及进阶

这里写自定义目录标题 一. RabbitMQ简介1.1. 消息中间件1.1.1.什么是消息中间件1.1.2.消息中间件的传递模式1. 1.2.1 点对点1. 1.2.2 发布订阅模式 1.1.3 消息中间件种类1.1.4 消息中间件的作用 2. RabbitMQ介绍2.1.RabbitMQ的起源2.2.RabbitMQ的安装及简单使用 3. RabbitMQ的简…

Unity UI -- (6)增加Toggle和Slider

在前面的小节中&#xff0c;我们已经有了一个空的设置菜单。现在让我们来添加设置选项。 在本节最后&#xff0c;我们的设置菜单的样子参考如下&#xff1a; 添加一个音乐开关&#xff08;Toggle&#xff09; 现在让我们来增加一个toggle&#xff0c;让用户能够通过它来对场景的…