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

本文主要是介绍行为型设计模式-责任链(chain of responsibility)模式-python实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

设计模式汇总:查看

通俗示例

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

通俗解释

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

责任链模式的组成包括:

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

责任链模式的优点

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

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)

总结

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

这篇关于行为型设计模式-责任链(chain of responsibility)模式-python实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138106

相关文章

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi