责任链模式(Chain of Responsibility Pattern)

发布于:2025-06-03 ⋅ 阅读:(29) ⋅ 点赞:(0)

很好!我们现在来深入讲解责任链模式(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)

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

🧭 处理流程图(Mermaid)

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

🧠 应用场景总结

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

✅ 总结口诀

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


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


网站公告

今日签到

点亮在社区的每一天
去签到