news 2026/2/10 15:27:11

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/2/10 12:25:22

餐饮行业数字化工具应用指南:从传统经营到智能升级

餐饮行业数字化工具应用指南:从传统经营到智能升级 【免费下载链接】bee 微信小程序-餐饮点餐外卖-开箱即用 项目地址: https://gitcode.com/GitHub_Trending/be/bee 引言:数字化浪潮下的餐饮变革 "每天高峰期,我们的服务员要同…

作者头像 李华
网站建设 2026/2/5 11:52:23

2、生成对抗网络(GANs)入门与实战解析

生成对抗网络(GANs)入门与实战解析 1. 引言 机器能否思考这一问题的历史比计算机本身还要悠久。1950 年,著名数学家、逻辑学家和计算机科学家艾伦图灵在论文《计算机器与智能》中提出了图灵测试。在这个测试中,一名不知情的观察者与门后的两个人进行交流,一个是人类,另…

作者头像 李华
网站建设 2026/2/5 22:45:47

如何快速掌握PC微信小程序wxapkg解密:2025终极完整教程

如何快速掌握PC微信小程序wxapkg解密:2025终极完整教程 【免费下载链接】pc_wxapkg_decrypt_python PC微信小程序 wxapkg 解密 项目地址: https://gitcode.com/gh_mirrors/pc/pc_wxapkg_decrypt_python 想要深入了解PC微信小程序解密技术?本指南将…

作者头像 李华
网站建设 2026/2/6 21:46:15

Python 读取 txt 某几列绘图的完整方法

Python 读取 txt 文件指定列并绘图的核心流程是:读取 txt 数据→提取目标列→数据预处理→绘图可视化。本文基于pandas(高效读取 / 处理数据)和matplotlib(绘图核心库),覆盖不同 txt 格式(有无表…

作者头像 李华
网站建设 2026/2/7 10:35:15

9、GAN训练挑战与优化策略解析

GAN训练挑战与优化策略解析 在生成对抗网络(GAN)的训练过程中,会遇到诸多复杂的问题,同时也有一系列有效的解决策略。下面将详细介绍GAN训练中的挑战以及相应的解决方法。 1. GAN训练的主要挑战 GAN训练存在一些常见的问题,主要包括模式崩溃、收敛缓慢和过泛化,具体如…

作者头像 李华