news 2026/7/15 6:35:31

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/7/14 22:42:40

TeslaMate完整搭建指南:快速构建免费特斯拉数据分析平台

TeslaMate完整搭建指南:快速构建免费特斯拉数据分析平台 【免费下载链接】teslamate 项目地址: https://gitcode.com/gh_mirrors/tes/teslamate 想要深入了解你的特斯拉性能表现吗?TeslaMate作为开源自托管解决方案,能够帮助你全面监…

作者头像 李华
网站建设 2026/7/1 14:08:44

IINA终极指南:macOS视频播放器的10个高效使用方案

IINA终极指南:macOS视频播放器的10个高效使用方案 【免费下载链接】iina 项目地址: https://gitcode.com/gh_mirrors/iin/iina 您是否曾经为在macOS上找不到理想的视频播放器而烦恼?当您需要播放多种格式的视频文件、管理复杂的字幕需求&#xf…

作者头像 李华
网站建设 2026/7/1 10:02:24

Open-AutoGLM悄然崛起:与ChatGLM的4个关键区别你必须掌握

第一章:Open-AutoGLM与ChatGLM的演进背景近年来,随着大规模语言模型技术的快速发展,自然语言处理在多个领域实现了突破性进展。其中,ChatGLM系列模型作为智谱AI推出的高性能双语对话模型,凭借其基于GLM(Gen…

作者头像 李华
网站建设 2026/7/1 16:19:48

AutoAWQ深度解析:大模型量化加速的完整解决方案

AutoAWQ深度解析:大模型量化加速的完整解决方案 【免费下载链接】AutoAWQ AutoAWQ implements the AWQ algorithm for 4-bit quantization with a 2x speedup during inference. 项目地址: https://gitcode.com/gh_mirrors/au/AutoAWQ 还在为大型语言模型的高…

作者头像 李华
网站建设 2026/7/6 8:49:23

为什么越来越多开发者选择Dify进行Agent开发?

为什么越来越多开发者选择 Dify 进行 Agent 开发? 在企业智能化浪潮席卷各行各业的今天,AI 不再只是实验室里的前沿技术,而是真正走进了客服窗口、内容工厂和内部知识系统。尤其是以大语言模型(LLM)为核心的 AI Agent …

作者头像 李华
网站建设 2026/7/1 10:02:16

专业级iOS设备越狱:palera1n工具深度解析与实战指南

在iOS生态系统的安全研究领域,设备越狱始终占据着重要地位。本文将为技术爱好者和安全研究人员深入剖析palera1n越狱工具的技术架构、操作原理及实战应用,帮助您全面掌握这一专业级越狱解决方案。 【免费下载链接】palera1n Jailbreak for arm64 devices…

作者头像 李华