责任链模式
责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这个模式将请求的处理者连接成一条链,沿着这条链传递请求,直到某个处理者处理它为止。
责任链模式的主要角色:
- 抽象处理者(Handler): 定义处理请求的接口,通常包含一个处理请求的抽象方法和一个指向下一个处理者的引用(即责任链中的下一个处理者)。
- 具体处理者(ConcreteHandler): 继承自抽象处理者,实现具体的处理逻辑。如果它能处理这个请求,它就处理,否则将请求传递给下一个处理者。
- 客户端(Client): 创建处理链并将请求传递给责任链的第一个处理者。
责任链模式的核心思想:
请求沿着责任链传递,直到某个处理者处理它或请求到达链的末尾。如果链上的一个对象无法处理请求,它会将请求传递给链中的下一个对象。
优点:
- 降低耦合度: 请求的发送者不需要知道是哪一个处理者处理了请求。
- 增强灵活性: 可以根据需要动态地添加、修改或删除处理者。
- 责任分担: 各个处理者只负责处理自己能处理的部分,其他部分交给后续处理者。
缺点:
- 调试困难: 如果链过长,调试时难以追踪请求的处理过程。
- 性能开销: 请求从链的头部传递到尾部,可能需要遍历整个链,增加了性能开销。
责任链模式的应用场景:
- 权限过滤: 在系统中进行权限检查时,多个处理者可以根据不同的权限级别进行处理。
- 事件处理: 在GUI系统中,事件(如点击事件)可能需要在多个处理者之间传递,直到某个处理者处理它。
- 日志处理: 系统日志可以根据不同的日志级别传递到不同的处理者。
示例
代码
// 抽象处理者,定义了处理请求的方法和设置下一个处理者的方法 abstract class Approver { protected Approver nextApprover; // 下一个处理者 public void setNextApprover(Approver nextApprover) { this.nextApprover = nextApprover; } public abstract void approveRequest(int amount); } // 具体处理者:组长,可以审批额度在1000元以下的请求 public class TeamLeader extends Approver { @Override public void approveRequest(int amount) { if (amount <= 1000) { System.out.println("组长批准了" + amount + "元的费用报销请求。"); } else if (nextApprover != null) { System.out.println("组长无法批准" + amount + "元的请求,交由上级处理..."); nextApprover.approveRequest(amount); } } } // 具体处理者:经理,可以审批额度在5000元以下的请求 public class Manager extends Approver { @Override public void approveRequest(int amount) { if (amount <= 5000) { System.out.println("经理批准了" + amount + "元的费用报销请求。"); } else if (nextApprover != null) { System.out.println("经理无法批准" + amount + "元的请求,交由上级处理..."); nextApprover.approveRequest(amount); } } } // 具体处理者:总监,可以审批额度在10000元以下的请求 public class Director extends Approver { @Override public void approveRequest(int amount) { if (amount <= 10000) { System.out.println("总监批准了" + amount + "元的费用报销请求。"); } else if (nextApprover != null) { System.out.println("总监无法批准" + amount + "元的请求,交由上级处理..."); nextApprover.approveRequest(amount); } else { System.out.println("请求" + amount + "元的报销费用过高,无法批准。"); } } } //客户端 public class TestChainOfResponsibilityPattern { public static void main(String[] args) { // 创建责任链上的处理者 Approver teamLeader = new TeamLeader(); Approver manager = new Manager(); Approver director = new Director(); // 设置责任链 teamLeader.setNextApprover(manager); // 组长的下一个处理者是经理 manager.setNextApprover(director); // 经理的下一个处理者是总监 // 模拟报销请求 System.out.println("处理100元的请求:"); teamLeader.approveRequest(100); System.out.println(); System.out.println("处理3000元的请求:"); teamLeader.approveRequest(3000); System.out.println(); System.out.println("处理8000元的请求:"); teamLeader.approveRequest(8000); System.out.println(); System.out.println("处理15000元的请求:"); teamLeader.approveRequest(15000); } }
解释:
使用责任链模式在处理费用报销请求时的应用。通过设置不同级别的处理者(组长、经理和总监),不同额度的报销请求可以根据责任链传递到合适的审批人。如果当前处理者无法处理请求,则将请求传递给链中的下一个处理者。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体