行为型设计模式-责任链(chain of responsibility)模式-python实现

news/2024/9/19 10:56:55/ 标签: python, 设计模式, 责任链模式

设计模式汇总:查看

通俗示例

想象一下你在一个客服中心工作,当一个客户的问题提交给客服中心时,这个问题可能会被第一个可用的客服人员处理。如果这位客服人员无法解决问题,那么问题会被转发给更高级别的客服。这个过程可能会一直持续到问题被解决或者达到最高级别的支持。这种处理问题的方式就是一个责任链的例子。

通俗解释

责任链模式是一种行为型设计模式,它允许将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。在责任链模式中,多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它或者请求到达链的末端。

责任链模式的组成包括:

  • 处理者(Handler):定义处理请求的接口,通常还包含一个指向下一个处理者的引用。
  • 具体处理者(Concrete Handler):处理它所负责的请求,如果无法处理,则将请求传递给链中的下一个处理者。

责任链模式的优点

  • 降低耦合度:请求的发送者和接收者之间无需知道对方的详细信息。
  • 增加灵活性:可以动态地添加或者删除处理者,无需修改现有代码。
  • 增强可扩展性:可以很容易地扩展新的处理者类。

Python代码示例

以下是一个责任链模式的简单实现:

python">class Manager:"""经理类"""successor = Nonename = ''def __init__(self, name):self.name = namedef setSuccessor(self, successor):# 设置上级self.successor = successordef handleRequest(self, request):# 处理请求passclass LineManager(Manager):"""直属经理"""def handleRequest(self, request):if request.requestType == 'DaysOff' and request.number <= 3:return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)else:print('%s:%s Num:%d Accepted CONTINUE' % (self.name, request.requestContent, request.number))if self.successor is not None:return self.successor.handleRequest(request)class DepartmentManager(Manager):"""部门经理"""def handleRequest(self, request):if request.requestType == 'DaysOff' and request.number <= 7:return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)else:print('%s:%s Num:%d Accepted CONTINUE' % (self.name, request.requestContent, request.number))if self.successor is not None:return self.successor.handleRequest(request)class GeneralManager(Manager):"""总经理"""def handleRequest(self, request):if request.requestType == 'DaysOff':return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)class Request:"""请求类,用于封装请求信息和处理请求。Attributes:requestType: 请求的类型。requestContent: 请求的内容。number: 请求的编号,默认为0。"""def __init__(self, requestType, requestContent, number=0):"""初始化请求对象。Args:requestType: 请求的类型。requestContent: 请求的内容。number: 请求的编号,默认为0。"""self.requestType = requestTypeself.requestContent = requestContentself.number = numberdef commit(self, generalManager):"""提交请求,由请求者调用,将请求交给管理者处理。Args:generalManager: 管理者对象,用于处理请求。Returns:处理请求后的返回值。"""ret = generalManager.handleRequest(self)print(ret)return ret# 当模块作为主程序运行时,以下代码块将被执行
if __name__ == '__main__':# 创建一线经理、部门经理和总经理的实例line_manager = LineManager('LINE MANAGER')department_manager = DepartmentManager('DEPARTMENT MANAGER')general_manager = GeneralManager('GENERAL MANAGER')# 设置一线经理的继任者为部门经理,部门经理的继任者为总经理line_manager.setSuccessor(department_manager)department_manager.setSuccessor(general_manager)# 创建请假申请实例并提交给一线经理审批# 申请一天假期request = Request(requestContent="'Ask 1 day off'", requestType='DaysOff', number=1)request.commit(line_manager)# 创建请假申请实例并提交给一线经理审批# 申请五天假期request = Request(requestContent="'Ask 5 day off'", requestType='DaysOff', number=5)request.commit(line_manager)# 创建请假申请实例并提交给一线经理审批# 申请十天假期request = Request(requestContent="'Ask 10 day off'", requestType='DaysOff', number=10)request.commit(line_manager)

总结

责任链模式通过将请求的发送者和接收者解耦,允许动态地构建处理者链,使得请求可以在多个对象之间传递,直到被处理。这种方式特别适用于那些需要多个对象共同处理一个请求的场景,比如异常处理、工作流处理等。


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

相关文章

【Rust光年纪】构建高效气象模型计算系统:Rust语言库推荐与比较

提升气象数据处理效率&#xff1a;Rust语言库全面解析 前言 气象学计算在科研、气象预测和应用程序开发中扮演着重要角色。本文将介绍几个用于Rust语言的气象学计算库&#xff0c;这些库提供了丰富的功能和灵活的API&#xff0c;可帮助开发人员进行气象数据处理、模型计算和可…

模拟网络丢包常用方法以及工具

文章目录 背景常用方法代码实现使用方法测试代码 使用网络流量控制工具 常用工具Clumsy 背景 在软件开发过程中&#xff0c;经常需要模拟不同的网络环境来测试应用在不同条件下的表现。 这些模拟可以采用多种方式进行&#xff0c;包括在代码中实现随机丢包、随机延时、乱序&am…

加密软件的加密方式有哪几种

全盘加密&#xff1a;这种加密方式会对整个硬盘驱动器或分区进行加密&#xff0c;确保存储在磁盘上的所有数据都受到保护。例如&#xff0c;BitLocker&#xff08;Windows内置&#xff09;和FileVault&#xff08;macOS内置&#xff09;就是此类加密软件的代表。 文件/文件夹加…

ParallelsDesktop19可在任何Mac上运行Windows软件

ParallelsDesktop19是一款Mac虚拟机软件&#xff0c;可在任何Mac上运行Windows&#xff0c;体验不同操作系统之间的无缝集成&#xff0c;并具有创新设计和增强功能&#xff0c;如无密码登录与TouchID、支持macOSSonoma14和增强打印选项。此外&#xff0c;它还支持运行更多Windo…

【Linux】解锁系统编程奥秘,高效进程控制的实战技巧

进程控制 1. 进程创建1.1. 操作系统的工作内容1.2. fork常规用法1.3. fork调用失败的原因 2. 进程终止2.1. main函数的返回值2.1.1. 退出码2.1.2. 退出码转化为错误描述的方式 2.2. 普通函数的返回值2.2.1. 错误码 2.3. 进程退出的场景2.4. 进程退出的方式2.4.1. main函数的返回…

element ui上传图片限制像素和文件大小

代码如下 <template><div><el-uploadclass"avatar-uploader"v-loading"loading":action"uploadUrl":data"dataObj"list-type"picture":with-credentials"true":multiple"false":show-f…

Tomcat 配置SSL

1、生成SSL证书&#xff1b; 2、配置Tomcat文件&#xff1b; <Connector port"8080" protocol"HTTP/1.1"SSLEnabled"true"keystoreFile"D:/hk.jks"keystorePass"123456"clientAuth"false"sslProtocol"TL…

C++系列-STL容器中的map容器

STL容器中的map容器 map的基本概念map的特点map的构造map的赋值map的插入map的删除map的大小map的交换查找&#xff0c;统计map的排序 无题二首其一 李商隐 昨夜星辰昨夜风&#xff0c;画楼西畔桂堂东。 身无彩凤双飞翼&#xff0c;心有灵犀一点通。 隔座送钩春酒暖&#xff0c…

【机器人工具箱Robotics Toolbox开发笔记(四)】 机器人位姿变换之位姿变换函数

机器人学的位姿变换相关内容,可以采用下列函数来进行计算。 (1)rpy2r() R = rpy2r (roll, pitch, yaw, options)能够根据一组回转角、俯仰角和偏转角求出对应齐次变换矩阵中的旋转矩阵R(3x3),其中3个角度rpy = [R, P, Y]分别对应于关于x、y、z轴的顺序旋转。 R = rpy2r…

Kafka-设计原理

ControllerLeader - PartitionRebalance消息发布机制HW与LEO日志分段 Controller Kafka核心总控制器Controller&#xff1a;在Kafka集群中会有一个或者多个broker&#xff0c;其中有一个broker会被选举为控制器&#xff08;Kafka Controller&#xff09;&#xff0c;它负责管理…

新手教学系列——如何应对业务扩展中的MongoDB升级挑战

在业务发展的早期,MongoDB的单节点配置就能满足大部分需求。然而,随着数据量的增加和业务的不断扩展,单节点已无法应对高并发的读写需求。此时,升级MongoDB成为必要选择,最常见的升级路径是从单节点扩展为副本集,随后再进行分片。本文将结合实际操作,详细讲解如何通过合…

LeetCode 209:长度最小的子数组 ← 滑动窗口

【题目来源】https://leetcode.cn/problems/minimum-size-subarray-sum/description/【题目描述】 给定一个含有 n 个正整数的数组和一个正整数 target。 找出该数组中满足其总和大于等于 target 的长度最小的子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&…

RK3566/RK3568 Android 11 动态隐藏应用通知

概述 总目录:RK3566/RK3568 Android 11 定制大全 在系统服务中增加动态隐藏APP通知,可以在上层app动态添加需要隐藏通知的APP,支持添加多个APP,支持移除,重启或关机后还能继续生效。 创建全局变量 1.定义全局变量 在frameworks/base/core/java/android/provider/Sett…

全面解读 Spring 和 Spring MVC 常用注解

Spring 是一个功能强大的 Java 框架&#xff0c;用于构建企业级应用程序。Spring MVC 是 Spring 框架的一部分&#xff0c;专注于构建基于 Web 的应用程序。为了有效地使用这些框架&#xff0c;了解常用注解及其应用场景至关重要。 1. 总体总结 Spring 框架和 Spring MVC 提供…

钢铁百科:Q460DR钢板材质、Q460DR钢板性能分析、Q460DR执行标准

Q460DR钢板是一种高性能的低温压力容器用钢板&#xff0c;具有优异的力学性能和广泛的应用范围。以下是对其材质、执行标准、化学成分、力学性能、交货状态、应用范围、常用规格及总结的详细介绍&#xff1a; 一、Q460DR材质 Q460DR钢板的命名中&#xff0c;“Q”代表屈服强度&…

vscode添加到环境变量之快捷使用

将 VSCode (Visual Studio Code) 添加到环境变量 PATH 中&#xff0c;可以为你带来以下便利&#xff1a; 1. 在命令行中全局调用 code 命令 功能: 当你将 VSCode 添加到 PATH 环境变量后&#xff0c;你可以在命令行&#xff08;如 CMD、PowerShell、Bash 等&#xff09;中直接…

X管家listUploadIntelligent.htm接口存在sql注入 附POC

@[toc] X管家listUploadIntelligent.htm接口存在sql注入 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用…

MFC dll无法显示tooltip问题

需要在APP 代码中添加hock class CTestApp : public CWinApp { public:CTestApp();HHOOK m_hHook; // 重写 public:static LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam);virtual BOOL InitInstance();DECLARE_MESSAGE_MAP()virtual int ExitIns…

npm i --legacy-peer-deps

npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force, or --legacy-peer-deps npm ERR! to accept an incorrect (and potentially broken) dependency resolution.1、原因&#xff1a;npm 升级到 7.x以上后&#xff0c;会出现上游依…

Grafana 在 Linux 系统上安装

Grafana 是一个开源的度量分析和可视化套件&#xff0c;它提供了丰富的数据源支持&#xff0c;包括但不限于 Prometheus、InfluxDB、Elasticsearch 等。在 Linux 系统上安装 Grafana 有多种方法&#xff0c;详细操作请参考官网 https://grafana.com/ 1. 使用包管理器安装&…