23种设计模式中的责任链模式

embedded/2025/4/1 7:59:51/

允许多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个处理器处理该请求为止。

责任链模式是一种处理请求的模式。它让多个处理器都有机会处理请求,直到其中某个处理成功为止。责任链模式把多个请求连成一条链,让请求在这条链上传递。

在实际场景中,财务审批就是一个责任链模式

我们来看看如何实现责任链模式

我们创建抽象类Approver ,然后创建4种不同级别的审核者,都扩展了Approver 。每个审核者都会比较自己的审核额度,如果有权限审核就直接审核通过,否则,将不审核,直接把请求传递给下一个审核者。

创建抽象审批者。

java">// 抽象审批者
public abstract class Approver {protected Approver nextApprover;protected String name;public Approver(String name) {this.name = name;}public void setNextApprover(Approver nextApprover) {this.nextApprover = nextApprover;}public abstract void processRequest(PurchaseRequest request);
}

创建扩展了该抽象审批者的具体类。

java">// 部门经理 - 可以审批不超过5000元的采购
public class DepartmentManager extends Approver {public DepartmentManager(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() <= 5000) {System.out.printf("部门经理 %s 审批了采购单: %s, 金额: %.2f元\n", name, request.getPurpose(), request.getAmount());} else if (nextApprover != null) {nextApprover.processRequest(request);}}
}
java">// 总监 - 可以审批不超过20000元的采购
public class Director extends Approver {public Director(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() <= 20000) {System.out.printf("总监 %s 审批了采购单: %s, 金额: %.2f元\n", name, request.getPurpose(), request.getAmount());} else if (nextApprover != null) {nextApprover.processRequest(request);}}
}
java">// 副总裁 - 可以审批不超过100000元的采购
public class VicePresident extends Approver {public VicePresident(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() <= 100000) {System.out.printf("副总裁 %s 审批了采购单: %s, 金额: %.2f元\n", name, request.getPurpose(), request.getAmount());} else if (nextApprover != null) {nextApprover.processRequest(request);}}
}
java">// 总裁 - 可以审批任何金额的采购
public class President extends Approver {public President(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {System.out.printf("总裁 %s 审批了采购单: %s, 金额: %.2f元\n", name, request.getPurpose(), request.getAmount());}
}

采购请求类。

java">// 采购请求
public class PurchaseRequest {private double amount;  // 采购金额private String purpose; // 采购目的public PurchaseRequest(double amount, String purpose) {this.amount = amount;this.purpose = purpose;}public double getAmount() {return amount;}public String getPurpose() {return purpose;}
}

测试示例。

java">public class PurchaseApprovalDemo {public static void main(String[] args) {// 创建审批人Approver manager = new DepartmentManager("张经理");Approver director = new Director("李总监");Approver vp = new VicePresident("王副总裁");Approver president = new President("赵总裁");// 设置责任链manager.setNextApprover(director);director.setNextApprover(vp);vp.setNextApprover(president);// 创建采购请求PurchaseRequest request1 = new PurchaseRequest(4500, "购买办公用品");PurchaseRequest request2 = new PurchaseRequest(12000, "团队建设活动");PurchaseRequest request3 = new PurchaseRequest(50000, "服务器设备升级");PurchaseRequest request4 = new PurchaseRequest(150000, "新办公室装修");// 处理采购请求System.out.println("===== 采购审批流程开始 =====");manager.processRequest(request1);manager.processRequest(request2);manager.processRequest(request3);manager.processRequest(request4);System.out.println("===== 采购审批流程结束 =====");}
}

这种模式在实际业务中非常常见,如工作流审批、客户服务请求处理、异常处理流程等。

总结

责任链模式是一种把一个或多个处理器组合在一起,依次处理请求的模式。

责任链模式的优势是添加新的处理器或调整处理器顺序非常容易。


http://www.ppmy.cn/embedded/176851.html

相关文章

Linux之基本命令和格式

先给大家介绍几个学习过程中会运用到的软件 VMMare&#xff1a;虚拟机软件作用是用来安装其他具体操作系统的平台 Redhat&#xff1a;Linux操作系统&#xff0c;用来操作软件和命令的系统平台&#xff0c;可以建多个 Xshell&#xff0c;Xftp&#xff1a;辅助工具&#xff0c…

JVM 内存参数调优详解

1. ​堆内存控制 -Xms4g # 初始堆内存大小&#xff08;JVM 启动时分配的堆内存&#xff09; -Xmx4g # 最大堆内存大小&#xff08;JVM 堆内存的上限&#xff09; ​详细说明 ​作用&#xff1a; -Xms&#xff08;Initial Heap Size&#…

APL语言的压力测试

APL语言的压力测试&#xff1a;探索极限与性能挑战 引言 APL&#xff08;A Programming Language&#xff09;是一种用于数组处理的编程语言&#xff0c;它以其简洁的语法和强大的数组操作能力广受欢迎。由于其独特的表达方式&#xff0c;APL在金融、工程和科学计算等领域被广…

贪心算法 力扣hot100热门面试算法题 面试基础 核心思路 背题

贪心算法 买卖股票的最佳时机 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/ 核心思路 如果假设今日买入&#xff0c;未来最高点是未知的&#xff0c;需要遍历后续数组&#xff0c;所以时间复杂度变成n^2&#xff1b; 那么如果假设今日卖出&#xff0c;遍…

诡异的服务重启原因探索

背景 同事做了一个订单导出功能,大约15万的数据量,使用golang语言开发,使用了ShardingSphere分表组件,通过多协程并行把15万的数据一次性读到内存,写excel并上传阿里OSS。 在本地测试没有发生什么异常的情况。部署到服务器,执行导出功能程序就会自动重启。 探索过程 …

Kafka是如何实现幂等性的??

Kafka通过幂等生产者&#xff08;Idempotent Producer&#xff09;机制来实现消息的幂等性&#xff0c;确保每条消息在Kafka中只被处理一次&#xff0c;即使在生产者重试发送的情况下也不会导致重复消息。以下是Kafka实现幂等性的详细说明&#xff1a; 1. 幂等生产者的基本概念…

【Linux-驱动开发-驱动分类】

Linux-驱动开发-驱动分类 ■ Linux-驱动分类■ Linux-字符设备■ 字符设备-注册与注销函数■ 字符设备-具体操作函数■ 字符设备-LICENSE 和作者信息■ 示例一&#xff1a;■ 示例一&#xff1a; 寄存器物理地址映射■ 新字符设备驱动■ 示例一&#xff1a;新字符设备驱动 ■ L…

单片机中C++的局部static变量的初始化仍然遵循控制流

实验 执行如下测试代码 class Test { public:Test(){bsp::di::Console().WriteLine("构造");} };void test_func() {bsp::di::Console().WriteLine("第一条语句");static Test test; }执行两次 test_func &#xff0c;在串口观察输出 可以看到 static …