责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。请求沿着对象链传递,直到有一个对象处理它为止。
责任链模式的特点
- 请求发送者与接收者解耦:发送者不需要知道处理请求的具体对象,只需将请求发送给第一个对象即可。
- 动态组合处理对象:可以动态地改变或扩展处理请求的对象链。
- 请求处理链:每个处理对象都可以决定是否处理请求以及将请求传递给下一个处理对象。
责任链模式的结构
- 处理者接口(Handler):定义了处理请求的接口方法。
- 具体处理者(ConcreteHandler):实现了处理请求的具体对象,如果不能处理请求则将请求传递给下一个处理者。
责任链模式的Python实现
以下是责任链模式在Python中的一个简单实现示例:
1. 定义处理者接口和具体处理者类
from abc import ABC, abstractmethod
# 处理者接口
class Handler(ABC):
@abstractmethod
def set_next(self, handler):
pass
@abstractmethod
def handle(self, request):
pass
# 具体处理者A
class ConcreteHandlerA(Handler):
def __init__(self):
self._next_handler = None
def set_next(self, handler):
self._next_handler = handler
return handler
def handle(self, request):
if request == "A":
return f"ConcreteHandlerA: Handling {request}"
elif self._next_handler:
return self._next_handler.handle(request)
else:
return f"No handler available for {request}"
# 具体处理者B
class ConcreteHandlerB(Handler):
def __init__(self):
self._next_handler = None
def set_next(self, handler):
self._next_handler = handler
return handler
def handle(self, request):
if request == "B":
return f"ConcreteHandlerB: Handling {request}"
elif self._next_handler:
return self._next_handler.handle(request)
else:
return f"No handler available for {request}"
2. 客户端代码
def client_code(handler):
requests = ["A", "B", "C"]
for request in requests:
result = handler.handle(request)
print(result)
if __name__ == "__main__":
handler_a = ConcreteHandlerA()
handler_b = ConcreteHandlerB()
handler_a.set_next(handler_b)
print("Chain: A -> B")
client_code(handler_a)
运行结果
说明
- 处理者接口(Handler):定义了处理请求的接口方法,包括
set_next
设置下一个处理者和handle
处理请求方法。 - 具体处理者(ConcreteHandlerA 和 ConcreteHandlerB):实现了处理者接口,每个具体处理者都可以处理特定的请求,如果自己不能处理则将请求传递给下一个处理者。
- 客户端代码:创建处理者对象并设置处理者链,然后通过客户端代码发送请求,请求将沿着链条传递直到有处理者处理它为止。
责任链模式在需要避免请求发送者与接收者之间紧密耦合的情况下非常有用,例如日志记录、权限验证、异常处理等场景。