操持模式-举动型-责任链模式

[复制链接]
发表于 2025-10-23 08:27:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1. 责任链模式概述

责任链模式(Chain of Responsibility Pattern) 是一种举动型操持模式,它允许多个对象依次处理惩罚哀求,形成一条处理惩罚链。每个对象都包罗对下一个对象的引用,假如它无法处理惩罚哀求,则将哀求转达给下一个对象。
责任链模式的重要特点


  •         低沉耦合:哀求的发送者和吸取者解耦,发送者无需关心哀求由谁处理惩罚。
  •         动态组合处理惩罚者:可以在运行时决定哀求的处理惩罚序次。
  •         增强机动性:可以方便地增长或修改处理惩罚逻辑。
责任链模式的焦点脚色


  •         Handler(处理惩罚者接口):界说处理惩罚哀求的方法,并包罗一个指向下一个处理惩罚者的引用。
  •         ConcreteHandler(详细处理惩罚者):详细实现处理惩罚逻辑,假如无法处理惩罚哀求,则转达给下一个处理惩罚者。
  •         Client(客户端):创建责任链,并向链的出发点发送哀求。

2. 责任链模式的 Python 实现

2.1 经典实现
  1. class Handler:
  2.     """处理者基类"""
  3.     def __init__(self, successor=None):
  4.         self.successor = successor  # 指向下一个处理者
  5.    
  6.     def handle_request(self, request):
  7.         if self.successor:
  8.             self.successor.handle_request(request)
复制代码
  1. class ConcreteHandlerA(Handler):
  2.     def handle_request(self, request):
  3.         if request == "A":
  4.             print("ConcreteHandlerA 处理请求 A")
  5.         elif self.successor:
  6.             self.successor.handle_request(request)
复制代码
  1. class ConcreteHandlerB(Handler):
  2.     def handle_request(self, request):
  3.         if request == "B":
  4.             print("ConcreteHandlerB 处理请求 B")
  5.         elif self.successor:
  6.             self.successor.handle_request(request)
复制代码
  1. # 创建责任链
  2. handler_chain = ConcreteHandlerA(ConcreteHandlerB())
  3. # 发送请求
  4. handler_chain.handle_request("A")  # 由 ConcreteHandlerA 处理
  5. handler_chain.handle_request("B")  # 由 ConcreteHandlerB 处理
  6. handler_chain.handle_request("C")  # 无处理者响应
复制代码
2.2 利用装饰器优化责任链
  1. class Handler:
  2.     def __init__(self):
  3.         self.next_handler = None
  4.    
  5.     def set_next(self, handler):
  6.         self.next_handler = handler
  7.         return handler
  8.    
  9.     def handle(self, request):
  10.         if self.next_handler:
  11.             return self.next_handler.handle(request)
  12.         return None
  13. class AuthHandler(Handler):
  14.     def handle(self, request):
  15.         if request.get("auth", False):
  16.             print("AuthHandler: 认证成功")
  17.             return super().handle(request)
  18.         print("AuthHandler: 认证失败")
  19.         return None
  20. class LoggingHandler(Handler):
  21.     def handle(self, request):
  22.         print("LoggingHandler: 记录日志日志")
  23.         return super().handle(request)
  24. # 创建责任链
  25. handler_chain = AuthHandler()
  26. handler_chain.set_next(LoggingHandler())
  27. # 处理请求
  28. request = {"auth": True}
  29. handler_chain.handle(request)  # 认证成功 -> 记录日志日志
复制代码

3. 责任链模式的优缺点

长处

✅ 低沉耦合:哀求的发送方和处理惩罚方解耦,机动性进步。
✅ 动态组合处理惩罚者:可以根据需求动态修改责任链布局。
✅ 增强扩展性:新增处理惩罚逻辑时,只需增长新的处理惩罚者,无需修改已有代码。
缺点

❌ 哀求大概未被处理惩罚:假如责任链没有符合的处理惩罚者,大概导致哀求未被处理惩罚。
❌ 调试困难:由于哀求大概颠末多个处理惩罚者,调试大概较为复杂。
❌ 大概影响性能:假如责任链过长,大概导致哀求的处理惩罚变慢。

4. 实用场景

责任链模式实用于以了局景:

  •         多个对象可以处理惩罚同一哀求,但详细由哪个对象处理惩罚在运行时确定(如日志日志记载、变乱处理惩罚)。
  •         渴望克制哀求发送者和吸取者之间的强耦合(如权限验证)。
  •         渴望能动态调解处理惩罚者的序次(如拦截器、过滤器链)。

5. 责任链模式的现实应用

5.1 Web 框架中的哀求处理惩罚

在 Web 框架(如 Flask、Django)中,中心件(Middleware)通常采取责任链模式。比方:
  1. class Middleware:
  2.     def __init__(self, next_middleware=None):
  3.         self.next = next_middleware
  4.    
  5.     def process_request(self, request):
  6.         if self.next:
  7.             return self.next.process_request(request)
  8. class AuthMiddleware(Middleware):
  9.     def process_request(self, request):
  10.         if not request.get("authenticated", False):
  11.             return "403 Forbidden"
  12.         return super().process_request(request)
  13. class LoggerMiddleware(Middleware):
  14.     def process_request(self, request):
  15.         print(f"Logging request: {request}")
  16.         return super().process_request(request)
  17. # 构建责任链
  18. middleware_chain = AuthMiddleware(LoggerMiddleware())
  19. # 处理请求
  20. request = {"authenticated": True}
  21. response = middleware_chain.process_request(request)
  22. print(response)
复制代码
5.2 变乱处理惩罚体系

如 GUI 变乱处理惩罚、游戏开辟中键盘/鼠标变乱的转达。
5.3 任务审批流程

如公司审批流程,司理审批后交给总监,总监审批后交给 CEO。

6. 总结

责任链模式通过将多个处理惩罚者串联成链,使得哀求可以沿着链转达,直到被符合的处理惩罚者处理惩罚。这种模式有效低沉了对象之间的耦合,进步了体系的机动性和可扩展性。
责任链模式实用于 哀求处理惩罚具有条理性或序次性的场景,如日志记载、权限校验、Web 中心件等。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表