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

责任链模式(Chain of Responsibility Pattern)

很好!我们现在来深入讲解责任链模式(Chain of Responsibility Pattern),这是行为型设计模式之一,非常适合处理请求链式传递的场景


我会通过:

✅ 概念解释 + 🎯 使用动机 + 🐍 完整 Python 调用代码(含注释)+ 🧭 清晰类图 & 流程图 + 场景举例

一步步帮你彻底掌握它的使用方式。


🧠 一句话定义

责任链模式允许多个对象都有机会处理请求,但只会有一个真正处理,请求沿着链条传递,直到被处理为止。


🎯 为什么需要责任链?

问题责任链的解决
处理流程耦合将请求处理者解耦成独立节点
扩展新处理器需要修改主流程添加新节点即可,无需修改其他代码
多个条件处理分支混杂让处理器职责单一,结构清晰

✅ 优点 vs ❌ 缺点

✅ 优点❌ 缺点
解耦请求与处理者请求可能“石沉大海”没人处理
动态组合链条,灵活排查责任节点较难
满足开闭原则依赖链顺序处理

📦 示例场景:请假审批流程

  • 员工请假
  • 小于 3 天:主管批准
  • 小于 10 天:经理批准
  • 超过 10 天:总监批准

🐍 Python 完整示例(含注释)


🧱 1️⃣ 抽象处理器(Handler)

from abc import ABC, abstractmethodclass Handler(ABC):def __init__(self):self._next = None  # 指向下一个处理器def set_next(self, next_handler):self._next = next_handlerreturn next_handler  # 方便链式编写@abstractmethoddef handle(self, request):pass

👷‍♂️ 2️⃣ 各级别处理器(ConcreteHandler)

class TeamLead(Handler):def handle(self, request):if request <= 3:print(f"👨‍💼 TeamLead 批准 {request} 天假")elif self._next:self._next.handle(request)else:print("❌ 无法处理请求")class Manager(Handler):def handle(self, request):if request <= 10:print(f"👩‍💼 Manager 批准 {request} 天假")elif self._next:self._next.handle(request)else:print("❌ 无法处理请求")class Director(Handler):def handle(self, request):if request <= 30:print(f"👨‍💼 Director 批准 {request} 天假")else:print("❌ 超出可批假天数,申请被拒")

🧪 3️⃣ 客户端调用

# 创建处理器实例
lead = TeamLead()
manager = Manager()
director = Director()# 构建链条:TeamLead -> Manager -> Director
lead.set_next(manager).set_next(director)# 模拟请假申请
for days in [2, 5, 14, 35]:print(f"\n📝 申请请假 {days} 天")lead.handle(days)

✅ 输出示例:

📝 申请请假 2 天
👨‍💼 TeamLead 批准 2 天假📝 申请请假 5 天
👩‍💼 Manager 批准 5 天假📝 申请请假 14 天
👨‍💼 Director 批准 14 天假📝 申请请假 35 天
❌ 超出可批假天数,申请被拒

🧭 类图(Mermaid)

«abstract»
Handler
-next
+set_next(handler)
+handle(request)
TeamLead
Manager
Director

🧭 处理流程图(Mermaid)

<=3天
>3天
<=10天
>10天
<=30天
>30天
客户端请求
TeamLead
批准
Manager
批准
Director
批准
拒绝

🧠 应用场景总结

场景示例
审批流程请假、报销审批
请求过滤器链Web中间件、安全校验
事件处理链UI 组件冒泡传播事件
日志责任链按等级处理日志输出

✅ 总结口诀

责任链模式:一条线传到底,谁能处理谁来管
✅ 让请求在链上流转,链上节点按职责处理,解耦调用逻辑!


是否要我改成你熟悉的例子(比如 API 请求验证 → 授权 → 路由分发)形式?我可以马上重构给你看~或者导出为图/流程表?需要哪种形式继续?

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

相关文章:

  • SpringCloud多环境配置的一些问题
  • 如何解析CAN报文物理值是负数的信号
  • 如何选择适合自己的LLM
  • 互联网大厂Java求职面试:高并发系统设计与架构实战
  • LeetCode热题100--189.轮转数组--中等
  • 人工智能应用:从技术突破到生态重构的演进之路
  • 【datawhaleAI春训营】楼道图像分类
  • 标题:试验台铁地板:革新之路
  • ARM子程序和栈
  • 第18章:赤色世界:文明的分支与新纪元
  • 雷电模拟器-超好用的Windows安卓模拟器
  • 以太网协议(IEEE 802.3)
  • 数据类型:String
  • 低功耗蓝牙BLE的通信可靠性分析
  • 内存碎片深度剖析
  • 多图详解VSCode搭建Python开发环境
  • BC8 十六进制转十进制
  • Vite 的工作流程
  • 大模型推理框架简介
  • 算法每日一题 | 入门-顺序结构-上学迟到
  • Linux 系统的指令详解介绍
  • 数据融合(Data Fusion)的概念与核心思想
  • DeepSeek-Prover-V2,DeepSeek推出的开源数学推理大模型
  • 实验4 mySQL查询和视图
  • MinIO实现https访问
  • Spring中的控制反转和依赖注入(IoC和DI)以及常见面试题
  • QTtricks
  • 怎么看户型好不好?
  • 1. std::result_of是什么?为什么它出现?
  • 【计算机视觉】三维重建:tiny-cuda-nn:高性能神经网络推理与训练的CUDA加速库