news 2026/4/16 15:07:10

Python 责任链模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 责任链模式

Python 中的责任链模式(Chain of Responsibility Pattern)

责任链模式是一种行为型设计模式,其核心目的是:
将请求的发送者和接收者解耦,让多个对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止

形象比喻:就像请假审批——员工先提交给主管,如果主管权限不够,就转给经理;经理不够就转给总监……直到有人能审批或拒绝。

责任链模式的优点
  • 解耦发送者和接收者:客户端无需知道谁来处理请求
  • 动态组合处理链:运行时可以自由添加、移除、重组处理器
  • 单一职责:每个处理器只负责自己能处理的请求
  • 灵活性高:容易扩展新处理器
典型应用场景
  • 日志系统(DEBUG → INFO → WARNING → ERROR 级别)
  • Web 框架中间件(认证 → 授权 → 日志 → 路由 → 响应)
  • 事件处理(如 GUI 事件冒泡)
  • 审批流程(请假、报销)
  • 过滤器链(敏感词过滤、XSS 防御)
  • 异常处理(try-except 链)
Python 实现示例:日志处理器链

我们实现一个分级日志系统:不同级别日志交给不同处理器(控制台、文件、邮件)。

fromabcimportABC,abstractmethod# 抽象处理器(Handler)classLogger(ABC):def__init__(self,next_logger=None):self.next_logger=next_logger# 链中的下一个处理器deflog(self,level:int,message:str):ifself.can_handle(level):self.handle(message)# 如果有下一个处理器,继续传递ifself.next_logger:self.next_logger.log(level,message)@abstractmethoddefcan_handle(self,level:int)->bool:pass@abstractmethoddefhandle(self,message:str):pass# 日志级别常量DEBUG=1INFO=2WARNING=3ERROR=4# 具体处理器1:控制台日志(处理所有级别)classConsoleLogger(Logger):defcan_handle(self,level:int)->bool:returnTrue# 所有日志都打印到控制台defhandle(self,message:str):print(f"[CONSOLE]{message}")# 具体处理器2:文件日志(只处理 WARNING 及以上)classFileLogger(Logger):defcan_handle(self,level:int)->bool:returnlevel>=WARNINGdefhandle(self,message:str):print(f"[FILE] 写入日志文件:{message}")# 具体处理器3:邮件通知(只处理 ERROR 级别)classEmailLogger(Logger):defcan_handle(self,level:int)->bool:returnlevel==ERRORdefhandle(self,message:str):print(f"[EMAIL] 发送紧急邮件通知:{message}")# 构建责任链defbuild_chain():# 链顺序:控制台 → 文件 → 邮件email_logger=EmailLogger()file_logger=FileLogger(email_logger)console_logger=ConsoleLogger(file_logger)returnconsole_logger# 客户端使用if__name__=="__main__":logger_chain=build_chain()logger_chain.log(DEBUG,"系统启动正常")# 只控制台logger_chain.log(INFO,"用户登录成功")# 只控制台logger_chain.log(WARNING,"磁盘空间不足")# 控制台 + 文件logger_chain.log(ERROR,"数据库连接失败!")# 控制台 + 文件 + 邮件

输出

[CONSOLE] 系统启动正常 [CONSOLE] 用户登录成功 [CONSOLE] 磁盘空间不足 [FILE] 写入日志文件: 磁盘空间不足 [CONSOLE] 数据库连接失败! [FILE] 写入日志文件: 数据库连接失败! [EMAIL] 发送紧急邮件通知: 数据库连接失败!
Pythonic 更简洁实现:函数式责任链

Python 支持高阶函数,可以用列表+循环实现轻量责任链。

fromtypingimportCallable,List# 定义处理器类型Handler=Callable[[str],bool]# 返回 True 表示已处理,不再向下传递defconsole_handler(message:str)->bool:print(f"[CONSOLE]{message}")returnFalse# 继续向下传递deffile_handler(message:str)->bool:if"错误"inmessageor"警告"inmessage:print(f"[FILE] 记录严重日志:{message}")returnFalsedefemail_handler(message:str)->bool:if"致命"inmessageor"失败"inmessage:print(f"[EMAIL] 紧急通知:{message}")returnTrue# 已处理,停止传递returnFalse# 构建链handlers:List[Handler]=[console_handler,file_handler,email_handler]deflog_message(message:str):forhandlerinhandlers:ifhandler(message):break# 某个处理器返回 True,停止链# 使用log_message("程序启动")log_message("用户登录")log_message("内存警告")log_message("数据库连接失败")
真实项目常见例子:Web 框架中间件

Flask/Django/FastAPI 的中间件本质就是责任链:

classMiddleware:def__init__(self,next_middleware=None):self.next=next_middlewaredef__call__(self,request):# 前置处理self.process_request(request)# 传递给下一个ifself.next:response=self.next(request)else:response=handle_request(request)# 最终处理# 后置处理returnself.process_response(response)classAuthMiddleware(Middleware):defprocess_request(self,request):ifnotrequest.user.is_authenticated:returnredirect("/login")classLoggingMiddleware(Middleware):defprocess_request(self,request):print(f"请求:{request.path}")# 构建链:Logging → Auth → 最终处理app=LoggingMiddleware(AuthMiddleware())
责任链模式结构总结
角色说明
Handler抽象处理器(Logger),定义处理接口和链指针
ConcreteHandler具体处理器(ConsoleLogger 等)
Client发送请求到链首(logger_chain.log())
责任链模式 vs 其他模式对比
模式目的处理方式典型场景
责任链请求沿链传递,直到被处理动态链、可能不处理中间件、日志、审批
装饰器层层增强功能固定链、全部执行功能包装
命令封装请求为对象支持队列、撤销操作历史
观察者广播通知多个对象一对多广播事件系统
Python 中的实用建议
  • 简单场景:用函数列表实现(最轻量)
  • 复杂场景:用类实现,支持状态和动态重组
  • 停止传递:处理器返回 True/None/Response 表示是否终止链
  • 常见库实现
    • Django 中间件
    • Flask 的@app.before_request
    • FastAPI 的 Dependencies 和 Middlewares
注意事项
  • 确保链的顺序正确(优先级高的放前面)
  • 避免循环链(会导致无限递归)
  • 如果没有处理器处理请求,要有默认行为(否则请求丢失)
  • 多线程时注意线程安全

责任链模式是构建可插拔、可扩展处理流程的利器,在 Web 框架、日志系统、过滤器中无处不在。

如果你想看更多实战例子(如 HTTP 请求中间件链、审批流程系统、敏感词过滤链),或者如何与装饰器模式结合,欢迎继续问!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 15:07:04

Multisim安装从零开始:小白必看的实操指南

Multisim 安装实战指南:从零部署电路仿真环境(新手避坑全记录) 你是不是也经历过这样的场景? 刚下定决心学电路设计,兴致勃勃地下载了 Multisim,结果点开安装包还没两分钟就弹出错误提示;好不…

作者头像 李华
网站建设 2026/4/10 22:18:11

3步搞定立体视觉:PSMNet深度感知实战指南

3步搞定立体视觉:PSMNet深度感知实战指南 【免费下载链接】PSMNet Pyramid Stereo Matching Network (CVPR2018) 项目地址: https://gitcode.com/gh_mirrors/ps/PSMNet 立体视觉深度感知技术正在改变我们理解三维世界的方式。PSMNet作为这项技术的杰出代表&a…

作者头像 李华
网站建设 2026/4/14 16:28:59

终极TFT_eSPI避坑指南:从零到精通的实战手册

在多年的嵌入式显示开发实践中,我发现TFT_eSPI是连接Arduino与TFT显示屏的最佳桥梁。这款专为ESP32、RP2040等主流微控制器优化的库,让显示项目开发效率提升了数倍。今天我将分享从配置到优化的完整实战经验。 【免费下载链接】TFT_eSPI Arduino and Pla…

作者头像 李华
网站建设 2026/4/16 11:12:09

IEC104工业通信协议:Java高性能实现的终极指南

IEC104工业通信协议:Java高性能实现的终极指南 【免费下载链接】IEC104 项目地址: https://gitcode.com/gh_mirrors/iec/IEC104 在工业自动化与电力系统监控领域,IEC104协议扮演着不可或缺的角色。这个基于Netty框架构建的Java实现方案&#xff…

作者头像 李华
网站建设 2026/4/16 12:51:51

从混沌到共鸣:当论文写作遇见你的“第二大脑”

屏幕上的光标在引言段落闪烁了四十五分钟,文献管理器里躺着217篇未读论文,而导师的邮件正在询问研究进展——这熟悉的场景背后,是传统学术写作范式在信息时代的系统性失灵。深夜的实验室里,李博士刚刚完成了一组复杂的数据分析&am…

作者头像 李华
网站建设 2026/4/16 13:07:44

Obsidian思维导图插件:3个步骤开启可视化知识管理新时代

Obsidian思维导图插件:3个步骤开启可视化知识管理新时代 【免费下载链接】obsidian-enhancing-mindmap obsidian plugin editable mindmap,you can edit mindmap on markdown file 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-enhancing-mindmap …

作者头像 李华