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

23种设计模式-行为型模式之责任链模式(Java版本)

Java 责任链模式(Chain of Responsibility Pattern)详解

🧠 什么是责任链模式?

责任链模式是一种行为型设计模式,它使多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。


🎯 使用场景

  • 多个对象可以处理一个请求,具体由运行时决定哪个对象处理
  • 动态指定请求的处理顺序
  • 需要解耦请求发送者与处理者

🏗️ 模式结构

  • Handler(抽象处理者):定义处理请求的接口,并包含对下一个处理者的引用
  • ConcreteHandler(具体处理者):实现请求的处理逻辑,如果不能处理则转发给下一个处理者
  • Client(客户端):构造处理链并发送请求

✅ 示例:请假审批流程

抽象处理者

public abstract class Handler {protected Handler next;public void setNext(Handler next) {this.next = next;}public abstract void handleRequest(int days);
}

具体处理者

public class TeamLeader extends Handler {@Overridepublic void handleRequest(int days) {if (days <= 1) {System.out.println("TeamLeader 批准了 " + days + " 天的假期");} else if (next != null) {next.handleRequest(days);}}
}public class Manager extends Handler {@Overridepublic void handleRequest(int days) {if (days <= 3) {System.out.println("Manager 批准了 " + days + " 天的假期");} else if (next != null) {next.handleRequest(days);}}
}public class Director extends Handler {@Overridepublic void handleRequest(int days) {if (days <= 7) {System.out.println("Director 批准了 " + days + " 天的假期");} else {System.out.println("请假天数太长,无法批准!");}}
}

客户端

public class LeaveRequest {public static void main(String[] args) {Handler teamLeader = new TeamLeader();Handler manager = new Manager();Handler director = new Director();teamLeader.setNext(manager);manager.setNext(director);teamLeader.handleRequest(2);  // 输出:Manager 批准了 2 天的假期teamLeader.handleRequest(5);  // 输出:Director 批准了 5 天的假期teamLeader.handleRequest(10); // 输出:请假天数太长,无法批准!}
}

✅ 优点

  • 降低耦合度,请求者无需知道处理逻辑细节
  • 动态组合处理流程,增强灵活性
  • 符合开闭原则,新增处理节点无需修改其他节点

⚠️ 缺点

  • 可能导致请求没有被处理
  • 调试不便,链路较长时难以追踪请求处理流程

🧩 使用建议

责任链模式非常适合处理审批流程、过滤器链、日志处理等需要“逐层传递、逐层判断”的场景。

http://www.xdnf.cn/news/1864.html

相关文章:

  • Python3(10) 元组
  • ubuntu(28):ubuntu系统多版本conda和多版本cuda共存
  • 插件热更新后界面不更新问题
  • Flutter 环境搭建 (Android)
  • 雷达水位计在山洪预警中的作用
  • Babylon.js 材质统一转换指南:将 AssetContainer 中的所有材质转换为 PBRMetallicRoughnessMaterial
  • 【Python-Day 5】Python 格式化输出实战:%、format()、f-string 对比与最佳实践
  • 测试流程?
  • Python3(11) 字典
  • Java学习手册:Java时间类使用
  • 16:00开始面试,16:08就出来了,问的问题有点变态。。。
  • react 常用钩子 hooks 总结
  • 《Keras 3 :使用 TFServing 提供 TensorFlow 模型》
  • Linux中你必须掌握的20个常见命令,提升工作效率!
  • 问答页面支持拖拽和复制粘贴文件,MaxKB企业级AI助手v1.10.6 LTS版本发布
  • conformer编码器
  • DeskGo 4.0(官方版)桌面管理工具软件下载及安装教程
  • JDBC之ORM思想及SQL注入
  • UWA DAY 2025 正式启动|十年筑基,驱动游戏未来引擎
  • Kubernetes 节点 Not Ready 时 Pod 驱逐机制深度解析(上)
  • Web漏洞--XSS之订单系统和Shell箱子
  • Android APP 热修复原理
  • ArrayUtils:数组操作的“变形金刚“——让你的数组七十二变
  • python实现简单的UI交互
  • RT Thread 发生异常时打印输出cpu寄存器信息和栈数据
  • C++11介绍
  • 【阿里云大模型高级工程师ACP习题集】2.5 优化RAG应用提升问答准确度(⭐️⭐️⭐️ 重点章节!!!)
  • C++面试复习日记(8)2025.4.25,malloc,free和new,delete的区别
  • Maven基础、HTTP协议、请求响应(Web后端笔记第一期)
  • 策略模式(Strategy Pattern)详解