责任链模式(行为型)

目录

一、前言

二、责任链模式

三、总结


一、前言

        责任链模式(Chain of Responsibility Pattern)也叫职责链模式,是一种行为型设计模式,职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链。并沿着这条链传递该请求,直到有一个对象处理它为止。

       责任链模式由以下角色组成:

Handler(抽象处理者):

定义一个处理请求的接口,包含处理请求的方法,还包含一个指向下一个处理者的引用(即链中的下一个处理者)

Concrete Handler(具体处理者):

继承或实现抽象处理者接口,具体处理请求的逻辑在这里实现,如果不能处理当前请求,则将请求传递给下一个处理者

Client(客户端):

负责创建并组装职责链,将请求发送给链中的第一个处理者

        整个责任链模式的结构图:

二、责任链模式

        比如一些请求制度,我们可以设置组长能够审批3天因为的假期,经理可以审批10天以内的假期,CEO可以审批30天以内的假期,不允许超过30天,这种时候就可以使用责任链模式进行演示。

        首先创建Handler类:

public abstract class Handler {public Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(int request);
}

        接着创建具体的实现类:

public class ConcreteHandlerOne extends Handler{@Overridepublic void handleRequest(int request) {if(request >= 0 && request < 3){System.out.println(String.format("组长同意请假:%s天", request));}else if(successor != null){successor.handleRequest(request);}}
}public class ConcreteHandlerTwo extends Handler{@Overridepublic void handleRequest(int request) {if(request >= 3 && request < 10){System.out.println(String.format("经理同意请假:%s天", request));}else if(successor != null){successor.handleRequest(request);}}
}public class ConcreteHandlerThree extends Handler{@Overridepublic void handleRequest(int request) {if(request >= 10 && request <= 30){System.out.println(String.format("CEO同意请假:%s天", request));}else {System.out.println("请假天数不符合要求");;}}
}

        最后是客户端Client类:

public class Client {public static void main(String[] args) {Handler handler1 = new ConcreteHandlerOne();Handler handler2 = new ConcreteHandlerTwo();Handler handler3 = new ConcreteHandlerThree();handler1.setSuccessor(handler2);handler2.setSuccessor(handler3);handler1.handleRequest(1);handler1.handleRequest(4);handler1.handleRequest(15);handler1.handleRequest(40);}
}

        运行结果:

三、总结

        优点与缺点:

优点:

降低耦合度:

请求的发送者和接收者解耦,发送者无需知道具体的接收者是谁,也无需了解处理链的结构

增加灵活性:

可以在运行时动态地添加或修改处理者,从而灵活地改变职责链

职责分担:

每个处理者只需关注自己能处理的任务,职责单一明确

增强扩展性:

增加新的具体处理者非常方便,不影响已有的系统

缺点:

可能导致请求未被处理:

如果链条上的所有处理者都不能处理请求,可能导致请求未被处理,除非在链的末端有个默认处理者

调试复杂:

由于请求是在链条上进行传递,调试起来较为困难,尤其是在链条较长或处理逻辑复杂时

性能问题:

如果链条很长,可能会影响系统性能,尤其是在每个处理者都需要进行复杂判断时

        应用场景:

请求的处理需要多个对象中的一个或多个进行处理:

如多个审批人依次审批请求的场景,每个审批人根据自己的权限或条件决定是否审批或将请求传递给下一个审批人

动态指定请求的处理者:

如在一个系统中,根据不同的请求类型动态选择不同的处理者

需要在处理者之间进行职责分离:

如在责任明确的系统中,每个模块各司其职,如日志记录、权限校验、数据处理等

例如时间处理系统、审批工作流、请求过滤器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24837.shtml

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

相关文章

第二十一讲:编译和链接

第二十一讲&#xff1a;编译和链接 1.翻译环境和运行环境1.1翻译环境1.2编译1.2.1预编译&#xff08;预处理&#xff09;1.2.2编译1.2.2.1词法分析1.2.2.2语法分析1.2.2.3语义分析 1.2.3汇编 1.3链接1.4运行环境1.5#define符号1.5.1#define的使用和原理1.5.2#define使用的陷阱注…

Python学习从0开始——Kaggle机器学习004总结2

Python学习从0开始——Kaggle机器学习004总结2 一、缺失值二、分类变量2.1介绍2.2实现1.获取训练数据中所有分类变量的列表。2.比较每种方法方法1(删除分类变量)方法2(序数编码)方法3独热编码 三、管道3.1介绍3.2实现步骤1:定义预处理步骤步骤2:定义模型步骤3:创建和评估管道 四…

【JAVA】javadoc,如何生成标准的JAVA API文档

目录 1.什么是JAVA DOC 2.标签 3.命令 1.什么是JAVA DOC 当我们写完JAVA代码&#xff0c;别人要调用我们的代码的时候要是没有API文档是很痛苦的&#xff0c;只能跟进源码去一个个的看&#xff0c;一个个方法的猜&#xff0c;并且JAVA本来就不是一个重复造轮子的游戏&#…

探索LLM 在金融领域有哪些潜在应用——通过使用 GPT-4 测试金融工程、市场预测和风险管理等 11 项任务

概述 近年来&#xff0c;用于自然语言理解和生成的人工智能技术在自然语言处理领域取得了突破性进展&#xff0c;OpenAI 的 GPT 和其他大规模语言模型在该领域取得了显著进步。这些模型通过先进的计算能力和算法&#xff0c;展示了处理复杂任务的能力&#xff0c;如理解复杂语…

vue2组件封装实战系列之tag组件

作为本系列的第一篇文章&#xff0c;不会过于的繁杂&#xff0c;并且前期的组件都会是比较简单的基础组件&#xff01;但是不要忽视这些基础组件&#xff0c;因为纵观elementui、elementplus还是其他的流行组件库&#xff0c;组件库的封装都是套娃式的&#xff0c;很多复杂组件…

关于python中的关键字参数

在python语言中存在两种传参方式&#xff1a; 第一种是按照先后顺序来传参&#xff0c;这种传参风格&#xff0c;称为“位置参数”这是各个编程语言中最普遍的方式。 关键字传参~按照形参的名字来进行传参&#xff01; 如上图所示&#xff0c;在函数中使用关键字传参的最大作…

【Java数据结构】—— 一维数组

一维数组 在计算机语言中数组是非常重要的集合类型&#xff0c;大部分计算机语言中数组具有如下三个基本特性&#xff1a; 一致性&#xff1a;数组只能保存相同数据类型元素&#xff0c;元素的数据类型可以是任何相同的数据类型。有序性&#xff1a;数组中的元素是有序的&…

Python中的函数式编程概念

Python中的函数式编程&#xff08;Functional Programming&#xff09;是一种编程范式&#xff0c;它强调使用函数作为主要的编程构建块&#xff0c;并且避免改变状态&#xff08;即避免使用可变的数据结构和变量&#xff09;和可变数据。虽然Python本身是一种多范式编程语言&a…

计算机网络 ——网络层(IPv4地址)

计算机网络 ——网络层&#xff08;IPv4地址&#xff09; 什么是IPv4地址IP地址的分类特殊的IP地址 查看自己的IPv4地址 我们今天来看IPv4地址&#xff1a; 什么是IPv4地址 IPv4&#xff08;Internet Protocol version 4&#xff09;是第四版互联网协议&#xff0c;是第一个被…

使用CodeGen进行程序综合推理

Program Synthesis with CodeGen — ROCm Blogs (amd.com) CodeGen是基于标准Transformer的自回归语言模型家族&#xff0c;用于程序合成&#xff0c;正如作者所定义的&#xff0c;它是一种利用输入-输出示例或自然语言描述生成解决指定问题的计算机程序的方法。 我们将测试的…

mqtt-emqx:paho.mqttv5的简单例子

# 安装emqx 请参考【https://blog.csdn.net/chenhz2284/article/details/139551293?spm1001.2014.3001.5502】 # 下面是示例代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</…

[office] excel做曲线图的方法步骤详解 #经验分享#知识分享#其他

excel做曲线图的方法步骤详解 Excel是当今社会最流行用的办公软件之一&#xff0c;Excel可以用于数据的整理、分析、对比。可以更直观的看到数据的变化情况&#xff0c;而有很多时候需要制作曲线图表进行数据比较&#xff0c;因此&#xff0c;下面是小编整理的如何用excel做曲线…

spark-3.5.1+Hadoop 3.4.0+Hive4.0 分布式集群 安装配置

Hadoop安装参考: Hadoop 3.4.0HBase2.5.8ZooKeeper3.8.4Hive4.0Sqoop 分布式高可用集群部署安装 大数据系列二-CSDN博客 一 下载:Downloads | Apache Spark 1 下载Maven – Welcome to Apache Maven # maven安装及配置教程 wget https://dlcdn.apache.org/maven/maven-3/3.8…

二叉树的右视图-力扣

这道题目是二叉树的层序遍历的扩展&#xff0c;对二叉树进行层序遍历&#xff0c;判断节点是否为该层的最后一个节点&#xff0c;如果是&#xff0c;则将其的数值添加到返回数组中。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode…

mqtt-emqx:简单安装emqx

安装依赖 yum install -y epel-release libatomic下载 cd /chz/install/emqx wget https://www.emqx.com/en/downloads/broker/5.7.0/emqx-5.7.0-el7-amd64.tar.gz解压 mkdir -p emqx && tar -zxvf emqx-5.7.0-el7-amd64.tar.gz -C emqx后台运行 cd /chz/install/e…

10、有条件提前退出关键字Return From Keyword If【robot framework】

在 Robot Framework 中&#xff0c;Return From Keyword If 是一个有用的关键字&#xff0c;它允许你在特定条件下从关键字中返回。这在需要在满足某个条件时提前退出关键字的情况下特别有用。 以下是 Return From Keyword If 的语法和使用示例&#xff1a; 语法 Return From…

分布式事务Seata中XA和AT模式介绍

Seata中XA和AT模式介绍 分布式事务介绍分布式解决方案解决分布式事务的思路Seata的架构Seata中的XA模式Seata的XA模型流程XA模式优缺点实现XA模式 Seata中的AT模式Seata中的AT模式流程实现AT模式AT模式优缺点 AT模式与XA模式的区别 分布式事务介绍 分布式事务&#xff0c;就是…

Hbase中Rowkey的设计方法

Hbase中Rowkey的设计方法 过去对于Rowkey设计方法缺乏理解&#xff0c;最近结合多篇博主的文章&#xff0c;进行了学习。有不少心得体会。总结下来供后续学习和回顾。 ##一、设计Rowkey的三个原则 1.长度原则&#xff1a;长度不能太长&#xff0c;小于100个字节。可以偏端一…

TypeScript是前端语言吗:一场深入而复杂的探讨

TypeScript是前端语言吗&#xff1a;一场深入而复杂的探讨 在编程的世界里&#xff0c;TypeScript是否属于前端语言&#xff0c;似乎是一个简单而又复杂的问题。它似乎简单得可以直接回答“是”或“否”&#xff0c;然而&#xff0c;深入其背后&#xff0c;我们却会发现这个问…

代码随想录算法训练营第36期DAY50

DAY50 如果写累了就去写套磁信吧。 198打家劫舍 class Solution {public: int rob(vector<int>& nums) { vector<int> dp(nums.size()); dp[0]nums[0]; if(nums.size()1) return nums[0]; dp[1]max(nums[0],nums[1]); …