设计模式:责任链模式——行为型模式

ops/2025/1/23 23:23:29/

目录

主要角色

优点

缺点

适用场景

示例代码

普通写法:

策略模式:

总结对比


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

主要角色

  • Handler(抽象处理者):定义一个处理请求的接口。通常包含一个后继处理者的引用,并提供设置后继的方法。

  • ConcreteHandler(具体处理者):实现了处理请求的具体逻辑,如果能够处理请求,则处理它;如果不能处理,则将请求转发给链中的下一个处理者;if-else内置于处理者中

  • Client(客户端):构造责任链并发起请求。

优点

  1. 降低耦合性:发送请求的对象不需要知道具体的处理者,甚至无需知道有多少个处理者。

  2. 灵活的处理顺序:可以动态调整链中对象的顺序,从而决定请求的处理顺序。

  3. 增强了可扩展性:增加新的处理者只需要继承处理者接口并实现自己的处理逻辑即可。

缺点

  1. 请求可能得不到处理:如果责任链上的所有处理者都无法处理请求,可能会导致请求得不到处理。

  2. 可能导致性能问题:如果责任链很长,可能需要经过多次传递才能找到合适的处理者,导致性能问题。

适用场景

  • 有多个对象可以处理同一个请求,且具体处理者事先未知或不固定。

  • 希望在不明确指定接收者的情况下,向多个对象中的一个提交请求。

  • 可以动态地指定能够处理请求的对象集合。

示例代码

需求:审批流程,不同金额对应不同级别的审批流程

普通写法:
class ApprovalProcess:def approve(self, amount):if amount <= 1000:return f"经理批准了金额申请 {amount}"elif amount <= 5000:return f"财务部门批准了金额申请 {amount}"else:return f"CEO批准了金额请求 {amount}"# 客户端代码
approval = ApprovalProcess()
amount = 2000
result = approval.approve(amount)
print(result)
策略模式:
# 抽象处理者
class ApprovalHandler:# 设置后继的方法def set_next(self, handler):self.next_handler = handlerreturn handlerdef handle(self, amount):if self.next_handler:return self.next_handler.handle(amount)return "金额未获批准"# 具体处理者: 经理 每个审批角色独立
class ManagerApprovalHandler(ApprovalHandler):def handle(self, amount):# 如果能够处理请求,则处理它;如果不能处理,则将请求转发给链中的下一个处理者# if-else内置于处理者中if amount <= 1000:return f"经理批准了金额申请 {amount}"else:return super().handle(amount)# 具体处理者: 财务部门 每个审批角色独立
class FinanceApprovalHandler(ApprovalHandler):def handle(self, amount):# 如果能够处理请求,则处理它;如果不能处理,则将请求转发给链中的下一个处理者# if-else内置于处理者中if amount <= 5000:return f"财务部门批准了金额申请 {amount}"else:return super().handle(amount)# 具体处理者: CEO 每个审批角色独立
class CEOApprovalHandler(ApprovalHandler):def handle(self, amount):return f"CEO批准了金额请求 {amount}"if __name__ == '__main__':# 客户端代码manager_handler = ManagerApprovalHandler()finance_handler = FinanceApprovalHandler()ceo_handler = CEOApprovalHandler()# 建立审批链——调整审批顺序简单manager_handler.set_next(finance_handler).set_next(ceo_handler)amount = 2000# 启动审批链result = manager_handler.handle(amount)print(result)

总结对比

特性使用责任链模式未使用责任链模式
解耦性高,每个审批角色独立,解耦低,审批逻辑集中在一个类中,耦合度高
扩展性高,新增审批角色很容易低,新增审批角色时需要修改主流程类代码
灵活性高,可以动态调整审批顺序,修改逻辑简单低,顺序固定,修改流程较麻烦
代码维护容易维护,符合开闭原则,修改不影响其他部分随着流程复杂化,代码维护变得困难
简洁性结构稍复杂,但清晰易懂,易于扩展代码简单,但流程扩展时容易变得臃肿和复杂

http://www.ppmy.cn/ops/152593.html

相关文章

如何运用python爬虫获取大型资讯类网站文章,并同时导出pdf或word格式文本?

这里&#xff0c;我们以比较知名的商业新知网站https://www.shangyexinzhi.com/为例进行代码编写&#xff0c;下面进行代码应用思路。 第一部分&#xff0c;分析网站结构 首先&#xff0c;我们来分析&#xff0c;要使用Python技术分析一个网站的结构&#xff0c;通常可以通过…

如何构建一个简单的React应用?

如何构建一个简单的React应用&#xff1f; React 是由 Facebook 开发和维护的一个前端 JavaScript 库&#xff0c;广泛用于构建用户界面。React 采用组件化的设计思想&#xff0c;可以让开发者更加高效地构建动态的、交互性强的 Web 应用。本文将带你一步步构建一个简单的 Rea…

网络安全技术之网络安全

网络安全之物理安全策略 物理安全策略的目的是保护计算机系统、网络服务器、打印机等硬件实体和信链路免受自然灾害、人为破坏和搭线攻击&#xff1b;验证用户的身份和使用权限、防用户越权操作&#xff1b;确保计算机系统有一个良好的电磁兼容工作环境&#xff1b;建立完备的…

MySQL入门(数据库、数据表、数据、字段的操作以及查询相关sql语法)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【Qt 常用控件】显示类控件——QLabel

目录 1.QLabel 1.1 textFormat 文本类型 普通文本和富文本 Markdown格式 1.2 alignment 文本对齐方式 1.3 wordWrap 自动换行 1.4 indent 文本缩进 1.5 margin 边距 1.6 buddy&#xff0c;qlabel伙伴 1.7 pixmap图片 和 scaledContents自动填充 1.QLabel 功能&#x…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

Numpy基础01(Jupyter基本用法/Ndarray创建与基本操作)

内容一&#xff1a;Jupyter开发环境 IPython 是一个增强型的 Python 交互式解释器&#xff0c;提供了自动补全、命令历史、魔法命令等功能。它支持与操作系统命令交互、内联绘图和多语言扩展&#xff0c;并可与 Jupyter Notebook 集成&#xff0c;适用于数据分析和科学计算。IP…

从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑

文章目录 从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑一 参考二 安装三 启动准备大模型文件 四 数据集&#xff08;关键&#xff09;&#xff01;4.1 Alapaca格式4.2 sharegpt4.3 在 dataset_info.json 中注册4.4 官方 alpaca_zh_demo 例子 999条数据, 本机微调 5分…