马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1. 责任链模式概述
责任链模式(Chain of Responsibility Pattern) 是一种举动型操持模式,它允许多个对象依次处理惩罚哀求,形成一条处理惩罚链。每个对象都包罗对下一个对象的引用,假如它无法处理惩罚哀求,则将哀求转达给下一个对象。
责任链模式的重要特点
- 低沉耦合:哀求的发送者和吸取者解耦,发送者无需关心哀求由谁处理惩罚。
- 动态组合处理惩罚者:可以在运行时决定哀求的处理惩罚序次。
- 增强机动性:可以方便地增长或修改处理惩罚逻辑。
责任链模式的焦点脚色
- Handler(处理惩罚者接口):界说处理惩罚哀求的方法,并包罗一个指向下一个处理惩罚者的引用。
- ConcreteHandler(详细处理惩罚者):详细实现处理惩罚逻辑,假如无法处理惩罚哀求,则转达给下一个处理惩罚者。
- Client(客户端):创建责任链,并向链的出发点发送哀求。
2. 责任链模式的 Python 实现
2.1 经典实现
- class Handler:
- """处理者基类"""
- def __init__(self, successor=None):
- self.successor = successor # 指向下一个处理者
-
- def handle_request(self, request):
- if self.successor:
- self.successor.handle_request(request)
复制代码- class ConcreteHandlerA(Handler):
- def handle_request(self, request):
- if request == "A":
- print("ConcreteHandlerA 处理请求 A")
- elif self.successor:
- self.successor.handle_request(request)
复制代码- class ConcreteHandlerB(Handler):
- def handle_request(self, request):
- if request == "B":
- print("ConcreteHandlerB 处理请求 B")
- elif self.successor:
- self.successor.handle_request(request)
复制代码- # 创建责任链
- handler_chain = ConcreteHandlerA(ConcreteHandlerB())
- # 发送请求
- handler_chain.handle_request("A") # 由 ConcreteHandlerA 处理
- handler_chain.handle_request("B") # 由 ConcreteHandlerB 处理
- handler_chain.handle_request("C") # 无处理者响应
复制代码 2.2 利用装饰器优化责任链
- class Handler:
- def __init__(self):
- self.next_handler = None
-
- def set_next(self, handler):
- self.next_handler = handler
- return handler
-
- def handle(self, request):
- if self.next_handler:
- return self.next_handler.handle(request)
- return None
- class AuthHandler(Handler):
- def handle(self, request):
- if request.get("auth", False):
- print("AuthHandler: 认证成功")
- return super().handle(request)
- print("AuthHandler: 认证失败")
- return None
- class LoggingHandler(Handler):
- def handle(self, request):
- print("LoggingHandler: 记录日志
") - return super().handle(request)
- # 创建责任链
- handler_chain = AuthHandler()
- handler_chain.set_next(LoggingHandler())
- # 处理请求
- request = {"auth": True}
- handler_chain.handle(request) # 认证成功 -> 记录日志

复制代码 3. 责任链模式的优缺点
长处
✅ 低沉耦合:哀求的发送方和处理惩罚方解耦,机动性进步。
✅ 动态组合处理惩罚者:可以根据需求动态修改责任链布局。
✅ 增强扩展性:新增处理惩罚逻辑时,只需增长新的处理惩罚者,无需修改已有代码。
缺点
❌ 哀求大概未被处理惩罚:假如责任链没有符合的处理惩罚者,大概导致哀求未被处理惩罚。
❌ 调试困难:由于哀求大概颠末多个处理惩罚者,调试大概较为复杂。
❌ 大概影响性能:假如责任链过长,大概导致哀求的处理惩罚变慢。
4. 实用场景
责任链模式实用于以了局景:
- 多个对象可以处理惩罚同一哀求,但详细由哪个对象处理惩罚在运行时确定(如日志
记载、变乱处理惩罚)。
- 渴望克制哀求发送者和吸取者之间的强耦合(如权限验证)。
- 渴望能动态调解处理惩罚者的序次(如拦截器、过滤器链)。
5. 责任链模式的现实应用
5.1 Web 框架中的哀求处理惩罚
在 Web 框架(如 Flask、Django)中,中心件(Middleware)通常采取责任链模式。比方:- class Middleware:
- def __init__(self, next_middleware=None):
- self.next = next_middleware
-
- def process_request(self, request):
- if self.next:
- return self.next.process_request(request)
- class AuthMiddleware(Middleware):
- def process_request(self, request):
- if not request.get("authenticated", False):
- return "403 Forbidden"
- return super().process_request(request)
- class LoggerMiddleware(Middleware):
- def process_request(self, request):
- print(f"Logging request: {request}")
- return super().process_request(request)
- # 构建责任链
- middleware_chain = AuthMiddleware(LoggerMiddleware())
- # 处理请求
- request = {"authenticated": True}
- response = middleware_chain.process_request(request)
- print(response)
复制代码 5.2 变乱处理惩罚体系
如 GUI 变乱处理惩罚、游戏开辟中键盘/鼠标变乱的转达。
5.3 任务审批流程
如公司审批流程,司理审批后交给总监,总监审批后交给 CEO。
6. 总结
责任链模式通过将多个处理惩罚者串联成链,使得哀求可以沿着链转达,直到被符合的处理惩罚者处理惩罚。这种模式有效低沉了对象之间的耦合,进步了体系的机动性和可扩展性。
责任链模式实用于 哀求处理惩罚具有条理性或序次性的场景,如日志记载、权限校验、Web 中心件等。
|