很好!我们现在来深入讲解责任链模式(Chain of Responsibility Pattern),这是行为型设计模式之一,非常适合处理请求链式传递的场景。
我会通过:
✅ 概念解释 + 🎯 使用动机 + 🐍 完整 Python 调用代码(含注释)+ 🧭 清晰类图 & 流程图 + 场景举例
一步步帮你彻底掌握它的使用方式。
🧠 一句话定义
责任链模式允许多个对象都有机会处理请求,但只会有一个真正处理,请求沿着链条传递,直到被处理为止。
🎯 为什么需要责任链?
问题 | 责任链的解决 |
---|---|
处理流程耦合 | 将请求处理者解耦成独立节点 |
扩展新处理器需要修改主流程 | 添加新节点即可,无需修改其他代码 |
多个条件处理分支混杂 | 让处理器职责单一,结构清晰 |
✅ 优点 vs ❌ 缺点
✅ 优点 | ❌ 缺点 |
---|---|
解耦请求与处理者 | 请求可能“石沉大海”没人处理 |
动态组合链条,灵活 | 排查责任节点较难 |
满足开闭原则 | 依赖链顺序处理 |
📦 示例场景:请假审批流程
- 员工请假
- 小于 3 天:主管批准
- 小于 10 天:经理批准
- 超过 10 天:总监批准
🐍 Python 完整示例(含注释)
🧱 1️⃣ 抽象处理器(Handler)
from abc import ABC, abstractmethod
class Handler(ABC):
def __init__(self):
self._next = None # 指向下一个处理器
def set_next(self, next_handler):
self._next = next_handler
return next_handler # 方便链式编写
@abstractmethod
def 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)
🧭 处理流程图(Mermaid)
🧠 应用场景总结
场景 | 示例 |
---|---|
审批流程 | 请假、报销审批 |
请求过滤器链 | Web中间件、安全校验 |
事件处理链 | UI 组件冒泡传播事件 |
日志责任链 | 按等级处理日志输出 |
✅ 总结口诀
责任链模式:一条线传到底,谁能处理谁来管
✅ 让请求在链上流转,链上节点按职责处理,解耦调用逻辑!
是否要我改成你熟悉的例子(比如 API 请求验证 → 授权 → 路由分发)形式?我可以马上重构给你看~或者导出为图/流程表?需要哪种形式继续?