Python与设计模式--责任链模式

23种计模式之 前言 +(5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、+(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、+(11)策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 + 设计原则

13-Python与设计模式–责任链模式

一、请假系统

假设有这么一个请假系统:员工若想要请3天以内(包括3天的假),只需要直属经理批准就可以了;
如果想请3-7天,不仅需要直属经理批准,部门经理需要最终批准;如果请假大于7天,不光要前两个经理批准,
也需要总经理最终批准。类似的系统相信大家都遇到过,那么该如何实现呢?首先想到的当然是ifelse…,
但一旦遇到需求变动,其臃肿的代码和复杂的耦合缺点都显现出来。简单分析下需求,“假条”在三个经理间是
单向传递关系,像一条链条一样,因而,我们可以用一条“链”把他们进行有序连接。

构造抽象经理类和各个层级的经理类:

class manager():successor = Nonename = ''def __init__(self, name):self.name = namedef setSuccessor(self, successor):self.successor = successordef handleRequest(self, request):pass
class lineManager(manager):def handleRequest(self, request):if request.requestType == 'DaysOff' and request.number <= 3:print '%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 != None:self.successor.handleRequest(request)
class departmentManager(manager):def handleRequest(self, request):if request.requestType == 'DaysOff' and request.number <= 7:print '%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 != None:self.successor.handleRequest(request)
class generalManager(manager):def handleRequest(self, request):if request.requestType == 'DaysOff':print '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)
class request():requestType = ''requestContent = ''number = 0

request类封装了假期请求。在具体的经理类中,可以通过setSuccessor接口来构建“责任链”,
并在handleRequest接口中实现逻辑。

场景类中实现如下:

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)req = request()req.requestType = 'DaysOff'req.requestContent = 'Ask 1 day off'req.number = 1line_manager.handleRequest(req)req.requestType = 'DaysOff'req.requestContent = 'Ask 5 days off'req.number = 5line_manager.handleRequest(req)req.requestType = 'DaysOff'req.requestContent = 'Ask 10 days off'req.number = 10line_manager.handleRequest(req)

打印如下:

LINE MANAGER:Ask 1 day off Num:1 Accepted OVER LINE MANAGER:Ask 5 days
off Num:5 Accepted CONTINUE DEPARTMENT MANAGER:Ask 5 days off Num:5
Accepted OVER LINE MANAGER:Ask 10 days off Num:10 Accepted CONTINUE
DEPARTMENT MANAGER:Ask 10 days off Num:10 Accepted CONTINUE GENERAL
MANAGER:Ask 10 days off Num:10 Accepted OVER

二、责任链模式

责任链模式的定义如下:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。
将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。需要说明的是,责任链模式中的应该只有一个处理者,也就是说,本例中的“最终批准”为该对象所谓的“请求处理”。

三、责任链模式的优点和应用场景

优点:
1、将请求者与处理者分离,请求者并不知道请求是被哪个处理者所处理,易于扩展。应用场景:
1、若一个请求可能由一个对请求有链式优先级的处理群所处理时,可以考虑责任链模式。除本例外,银行的客户请求处理系统也可以用责任链模式实现(VIP客户和普通用户处理方式当然会有不同)。

四、责任链模式的缺点

1、如果责任链比较长,会有比较大的性能问题;
2、如果责任链比较长,若业务出现问题,比较难定位是哪个处理者的问题。

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

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

相关文章

LeetCode52. N-Queens II

文章目录 一、题目二、题解 一、题目 The n-queens puzzle is the problem of placing n queens on an n x n chessboard such that no two queens attack each other. Given an integer n, return the number of distinct solutions to the n-queens puzzle. Example 1: I…

用CHAT总结费曼学习法的关键

问CHAT&#xff1a;费曼学习法的关键 CHAT回复&#xff1a;费曼学习法是由著名物理学家理查德费曼所发明的一种学习方法&#xff0c;旨在以深入理解为目标&#xff0c;帮助自己学习新的知识和技能。 费曼学习法有四个关键步骤&#xff1a; 1. 学习&#xff1a;首先&#xff0…

阿里云服务器2核2G3M配置购买和续费同享99元1年,最后2天赶紧囤货

经济型e实例2核2G 3M固定带宽 40G ESSD Entry云盘&#xff0c;价格为99元1年&#xff0c;这款云服务器是阿里云在11月份推出的特价云服务器&#xff0c;不管是用户还是老用户&#xff0c;都觉得这个价格确实非常划算&#xff0c;但是有的用户觉得现在暂时没有使用云服务器的需求…

​LeetCode解法汇总1670. 设计前中后队列

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 请你设计一…

Es6笔记之箭头函数与解构赋值

目录 箭头函数 箭头函数 this 箭头函数与普通函数的区别 解构赋值 数组解构 对象解构 展开运算符 与 剩余运算符 箭头函数 箭头函数是一种声明函数的简洁语法&#xff0c;它与普通函数并无本质的区别&#xff0c;差异性更多体现在语法格式上。 <script>// const …

LLM大语言模型

大语言模型的定义 大语言模型&#xff08;英文&#xff1a;Large Language Model&#xff0c;缩写LLM&#xff09;&#xff0c;也称大型语言模型&#xff0c;是一种人工智能模型&#xff0c;旨在理解和生成人类语言。它们在大量的文本数据上进行训练&#xff0c;可以执行广泛的…

在Rust中处理命令行参数和环境变量

1.摘要 Rust的命令行和环境变量处理在标准库中提供了一整套实现方法, 在本文中除了探索标准库的使用方法之外, 也在不断适应Rust独有的语法特点。在本文中, 我们通过标准库函数的返回值熟悉了迭代器的使用方法, 操作迭代器精确控制保存的内容, 包括字符串和键值对的使用方法。…

美创科技受邀亮相第二届全球数字贸易博览会

11月23日-27日&#xff0c;由浙江省人民政府、商务部共同主办的第二届全球数字贸易博览会&#xff08;以下简称“数贸会”&#xff09;圆满落幕。围绕“国家级、国际性、数贸味”的目标定位&#xff0c;以“数字贸易 商通全球”为主题&#xff0c;数贸会重点展示数字贸易全产业…

伪原创工具,免费的5款伪原创工具

寻找一款合适的伪原创工具是提高写作效率的重要一环。在这里&#xff0c;我们为您推荐了五款不同特点的伪原创工具&#xff0c;并对它们进行了详细的测评。 第一款伪原创工具&#xff1a;147SEO改写 147SEO改写是一款强大的AI智能伪原创写作工具&#xff0c;具备多个模板供用…

亚马逊云科技 re:Invent 2023:科技前沿风向标

一、前言 亚马逊云科技 re:Invent 2023 已于内华达州的拉斯维加斯盛大举行。 re:Invent 2023 直播活动地址&#xff1a;https://webinar.amazoncloud.cn/reInvent2023/ 关注参加 re:Invent 大会你将有机会参与学习、交流&#xff0c;聆听专家演讲&#xff0c;并观看 Amazon …

物理层之三种数据交换方式(电路交换、报文交换、分组交换(数据报方式、虚电路方式))

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Linux端口流量统计

Ubuntu sudo apt-get install wiresharkCentOS sudo yum install wiresharkUDP端口统计 sudo tshark -i <interface> -f "udp port <port_number>" -a duration:60 -q -z conv,udp请将 替换为你的网络接口&#xff0c;<port_number> 替换为要监…

玻色量子对外合作

2023年 2023.7 首个央企量子云计算项目&#xff0c;中标&#xff01; 2023.6 勇闯“量子电力”新领域&#xff0c;玻色量子与清大科越达成战略合作 2023.5 玻色量子签约移动云“五岳”量子云计算创新加速计划&#xff01; 2023.3 “量子计算通信”&#xff01;玻色量子与…

Mysql基础(六)多表查询

版权申明&#xff1a;本文用于个人学习记录&#xff0c;学习课程为黑马程序员的mysql教程。如需获取官方的学习视频和文档资料&#xff0c;请至黑马程序员官方获取。下面附上教学视频的链接地址&#xff0c;向提供免费教学视频的老师致敬&#xff0c;学如逆水行舟&#xff0c;不…

ubuntu下如何查看.gz压缩包中的内容,以及grep过滤查找文件中的某些内容

1、查看压缩包file.gz中的全部内容 $ zcat file.gz 2、对一个.gz的压缩包解压缩 $ gunzip file.gz 3、过滤查找文件中的某些内容 $ grep "Hello" file.txt 注&#xff1a;我通常先解压&#xff0c;然后再grep 4、过滤查找文件中的内容&#xff0c;并显示其上下3行…

一维数组,逆序存放并输出【样例输入】20 30 10 50 40 90 80 70【样例输出】70 80 90 40 50 10 30 20

一维数组&#xff0c;逆序存放并输出 【样例输入】 20 30 10 50 40 90 80 70 【样例输出】 70 80 90 40 50 10 30 20 以下是使用C语言编写的将一维数组逆序存放并输出的示例代码&#xff1a; #include <stdio.h>void reverseArray(int arr[], int size) {int start…

算法基础之单调栈

单调栈 求左边最小最近的数的值 没有返回-1 将左边数存入栈(数组模拟) 若stk[tt] >x 说明大于当前值 tt– 利用栈的先进后出特性 能找到左边最近的 #include<iostream>using namespace std;const int N100010;int skt[N],tt;int main(){int n;cin>>n;for(in…

UE使用C++通过定时器启用和停用Tick

写在前面 PrimaryActorTick.bCanEverTick这个赋值为true也好&#xff0c;false也好&#xff0c;好像只能在构造函数里面起作用&#xff0c;应该就是当在构造函数里面执行 PrimaryActorTick.bCanEverTick true; 之后&#xff0c;UE会在BeginPlay阶段自动执行 PrimaryActorT…

JS splice的使用总结

JS splice的使用总结 JavaScript splice() 方法 JavaScript splice() 方法 直译&#xff1a;粘接 定义和用法&#xff1a; splice() 方法用于添加或删除数组中的元素。 这种方法会改变原始数组 参数 Values&#xff1a; 参数描述index必需。从何处添加/删除元素。该参数是开…

数据库的设计规范

文章目录 第一范式&#xff08;1NF&#xff09;&#xff1a;列不可再分 第二范式 &#xff08;2NF&#xff09;&#xff1a;所有非主键字段&#xff0c;都必须 完全依赖主键&#xff0c;不能部分依赖 第三范式&#xff08;3NF&#xff09;&#xff1a;所有非主键字段不能依赖于…