小说网站虚拟主机,本地邵阳网站建设,网站的建设费用属于什么科目,网站备案的原则Python 中的责任链模式#xff08;Chain of Responsibility Pattern#xff09;
责任链模式是一种行为型设计模式#xff0c;其核心目的是#xff1a; 将请求的发送者和接收者解耦#xff0c;让多个对象都有机会处理请求。将这些对象连成一条链#xff0c;并沿着这条链传…Python 中的责任链模式Chain of Responsibility Pattern责任链模式是一种行为型设计模式其核心目的是将请求的发送者和接收者解耦让多个对象都有机会处理请求。将这些对象连成一条链并沿着这条链传递请求直到有一个对象处理它为止。形象比喻就像请假审批——员工先提交给主管如果主管权限不够就转给经理经理不够就转给总监……直到有人能审批或拒绝。责任链模式的优点解耦发送者和接收者客户端无需知道谁来处理请求动态组合处理链运行时可以自由添加、移除、重组处理器单一职责每个处理器只负责自己能处理的请求灵活性高容易扩展新处理器典型应用场景日志系统DEBUG → INFO → WARNING → ERROR 级别Web 框架中间件认证 → 授权 → 日志 → 路由 → 响应事件处理如 GUI 事件冒泡审批流程请假、报销过滤器链敏感词过滤、XSS 防御异常处理try-except 链Python 实现示例日志处理器链我们实现一个分级日志系统不同级别日志交给不同处理器控制台、文件、邮件。fromabcimportABC,abstractmethod# 抽象处理器HandlerclassLogger(ABC):def__init__(self,next_loggerNone):self.next_loggernext_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:passabstractmethoddefhandle(self,message:str):pass# 日志级别常量DEBUG1INFO2WARNING3ERROR4# 具体处理器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:returnlevelWARNINGdefhandle(self,message:str):print(f[FILE] 写入日志文件:{message})# 具体处理器3邮件通知只处理 ERROR 级别classEmailLogger(Logger):defcan_handle(self,level:int)-bool:returnlevelERRORdefhandle(self,message:str):print(f[EMAIL] 发送紧急邮件通知:{message})# 构建责任链defbuild_chain():# 链顺序控制台 → 文件 → 邮件email_loggerEmailLogger()file_loggerFileLogger(email_logger)console_loggerConsoleLogger(file_logger)returnconsole_logger# 客户端使用if__name____main__:logger_chainbuild_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# 定义处理器类型HandlerCallable[[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_middlewareNone):self.nextnext_middlewaredef__call__(self,request):# 前置处理self.process_request(request)# 传递给下一个ifself.next:responseself.next(request)else:responsehandle_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 → 最终处理appLoggingMiddleware(AuthMiddleware())责任链模式结构总结角色说明Handler抽象处理器Logger定义处理接口和链指针ConcreteHandler具体处理器ConsoleLogger 等Client发送请求到链首logger_chain.log()责任链模式 vs 其他模式对比模式目的处理方式典型场景责任链请求沿链传递直到被处理动态链、可能不处理中间件、日志、审批装饰器层层增强功能固定链、全部执行功能包装命令封装请求为对象支持队列、撤销操作历史观察者广播通知多个对象一对多广播事件系统Python 中的实用建议简单场景用函数列表实现最轻量复杂场景用类实现支持状态和动态重组停止传递处理器返回 True/None/Response 表示是否终止链常见库实现Django 中间件Flask 的app.before_requestFastAPI 的 Dependencies 和 Middlewares注意事项确保链的顺序正确优先级高的放前面避免循环链会导致无限递归如果没有处理器处理请求要有默认行为否则请求丢失多线程时注意线程安全责任链模式是构建可插拔、可扩展处理流程的利器在 Web 框架、日志系统、过滤器中无处不在。如果你想看更多实战例子如 HTTP 请求中间件链、审批流程系统、敏感词过滤链或者如何与装饰器模式结合欢迎继续问