当前位置: 首页 > news >正文

通过一个例子,说明Python的责任链设计模式有什么优缺点

责任链设计模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将一个请求沿着处理者链进行传递,直到有一个处理者处理它为止。在Python中,这种模式可以通过多种方式实现,通常涉及到一系列对象,每个对象都包含对另一个对象的引用。当一个对象不能处理请求时,它会将请求传递给链中的下一个对象,依此类推。

举例说明

假设我们有一个审批系统,员工提交报销单据后,需要经过多个级别的经理审批。我们可以使用责任链设计模式来实现这个过程:

class Handler:def __init__(self, successor=None):self._successor = successordef handle_request(self, request):if self.can_handle(request):self.process(request)else:if self._successor:self._successor.handle_request(request)else:print("No handler available for the request.")def can_handle(self, request):# 定义哪些请求可以被当前处理器处理passdef process(self, request):# 处理请求print(f"Request {request} processed by {self.__class__.__name__}")# 具体的处理者
class ManagerA(Handler):def can_handle(self, request):return request <= 5000  # 假设经理A负责审批5000元以下的报销class ManagerB(Handler):def __init__(self):super().__init__(successor=Supervisor())def can_handle(self, request):return request > 5000 and request <= 10000  # 假设经理B负责5000到10000元class Supervisor(Handler):def can_handle(self, request):return request > 10000  # 假设主管负责审批10000元以上的报销# 创建责任链
manager_a = ManagerA(ManagerB())
manager_b = ManagerB()
supervisor = Supervisor()# 提交报销单据
manager_a.handle_request(4500)  # 经理A处理
manager_a.handle_request(7000)  # 经理B处理
manager_a.handle_request(12000) # 主管处理

优点

  1. 解耦请求者和处理者:请求的发送者和接收者不需要了解对方,只需知道链的存在。
  2. 动态调整链:链中的处理者可以动态地添加或删除,增加系统的灵活性。
  3. 可扩展性:新的请求处理者可以很容易地添加到链中,而不需要修改现有代码。
  4. 简化对象之间的通信:对象不需要知道其他对象的存在,只需与它的后继者通信。

缺点

  1. 性能问题:如果链太长,可能会造成性能问题,因为每个请求都必须遍历整个链。
  2. 调试困难:责任链可能会导致代码调试困难,因为请求的流动不是立即可见的。
  3. 请求处理不确定性:如果链中的处理者都没有处理请求,可能会导致请求未被处理。
  4. 过度使用:如果不当使用,责任链模式可能会使系统设计变得复杂。

责任链设计模式适用于请求的处理者不固定,或者请求的处理者可能动态变化的情况。通过合理使用,它可以提高系统的模块化和灵活性。

http://www.lryc.cn/news/364519.html

相关文章:

  • 场地预定小程序基于FastAdmin+UniApp
  • CrossPrefetch: Accelerating I/O Prefetching for Modern Storage——论文泛读
  • 详解 Spark Streaming 的 DStream 对象
  • QT常用控件
  • 如何解决chatgpt出现503 bad gateway的问题
  • Halcon 双相机标定与拼图(二)
  • 【加密与解密】【04】Java安全架构
  • 论文阅读:Neural Scene Flow Prior
  • 如何通过 6 种简单方法将照片从华为转移到 PC?
  • QtCharts使用
  • 深入分析 Flink SQL 工作机制
  • Spring Bean参数校验Validator
  • AOP案例
  • Facebook海外户Facebook广告被暂停的原因
  • 网站企业需要适用于什么服务器?
  • winscp无法上传,删除,修改文件并提示权限不够的分析
  • Hadoop3:MapReduce之InputFormat数据输入过程整体概览(0)
  • 【Leetcode Python】70.爬楼梯
  • 深度学习 - 张量的广播机制和复杂运算
  • 【CSS】will-change 属性详解
  • linux安装mysql后,配置mysql,并连接navicat软件
  • 【学习笔记】Axios、Promise
  • 自然资源-关于加强规划实施监督管理的指导意见(浙江省自然资源厅学习借鉴)
  • 408链表的创建和初始化
  • Python数据框/列表生成一列多个同样的值
  • 使用 MDC 实现日志链路跟踪,包教包会!
  • 【成都信息工程大学】只考程序设计!成都信息工程大学计算机考研考情分析!
  • 将单列数据帧转换成多列数据帧
  • 信息学奥赛初赛天天练-20-完善程序-vector数组参数引用传递、二分中值与二分边界应用的深度解析
  • 推荐系统学习 一