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

embedded/2025/1/24 4:00:35/

目录

主要角色

优点

缺点

适用场景

示例代码

普通写法:

策略模式:

总结对比


责任链模式(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/embedded/156463.html

相关文章

在Windows/Linux/MacOS C++程序中打印崩溃调用栈和局部变量信息

打印崩溃调用栈和局部变量信息的方法有所不同。以下是针对 Windows、Linux 和 MacOS 的示例代码。 Windows 在 Windows 上&#xff0c;可以使用 Windows API 来捕获异常并打印调用栈。 #include <windows.h> #include <DbgHelp.h> #include <stdio.h> #in…

mac配置stable diffusion以及模型出图优化

1. 基础stable diffusion webui安装 使用的工程是stable-diffusion-webui&#xff0c;直接clone下来即可。 然后创建一个conda环境&#xff0c;python为3.9 激活conda环境后&#xff0c;执行./webui.sh即可。脚本会自动安装必要的包&#xff0c;然后启动网页。 默认有一个sd…

JAVA 使用反射比较对象属性的变化,记录修改日志。使用注解【策略模式】,来进行不同属性枚举值到中英文描述的切换,支持前端国际化。

1.首先定义一个接口&#xff0c;接口中有两个方法&#xff0c;分别是将属性转换成英文描述和中文描述。 其实就是将数据库中记录的 0 1 &#xff0c;转换成后面的描述 这边定义了中文转换为默认方法&#xff0c;是因为有些属性不需要进行中文转换&#xff0c;或者该属性的枚举…

PID 控制算法(二):C 语言实现与应用

在本文中&#xff0c;我们将用 C 语言实现一个简单的 PID 控制器&#xff0c;并通过一个示例来演示如何使用 PID 控制算法来调整系统的状态&#xff08;如温度、速度等&#xff09;。同时&#xff0c;我们也会解释每个控制参数如何影响系统的表现。 什么是 PID 控制器&#xf…

【JavaEE】Spring(1)

一、什么是Spring和SpringBoot Spring是Java应用程序的开发框架&#xff0c;其目的就是为了简化Java开发&#xff1b;SpringBoot是在spring框架的基础上构建的一个快速开发框架&#xff0c;其作用是进一步简化Spring程序开发 二、SpringBoot项目 2.1 创建项目 1. 设置jdk版本…

使用repo下载android源码,Ubuntu安装repo

由于网络原因&#xff0c;有时可能连接不到google&#xff0c;所以这里推荐直接使用镜像网站下载&#xff0c;并配置repo的更新源为镜像源 1 &#xff0c; 新建一个文件夹&#xff0c;从清华源下载下载git-repo到本地 git clone https://mirrors.tuna.tsinghua.edu.cn/git/git…

Flutter 使用 flutter_inappwebview 加载 App 本地 HTML 文件

在 Flutter 开发中&#xff0c;加载本地 HTML 文件是一个常见的需求&#xff0c;尤其是在需要展示离线内容或自定义页面时。flutter_inappwebview 是一个功能强大的插件&#xff0c;支持加载本地文件和网络资源。本文将详细介绍如何使用 flutter_inappwebview 加载 App 本地 HT…

Apache Tomcat文件包含漏洞复现(详细教程)

1.漏洞原理 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;其安装后会默认开启ajp连接器&#xff0c;方便与其他web服务器通过ajp协议进行交互。属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发…