行为模式(Behavioral Design Patterns) 主要解决的是对象之间的职责划分与协作问题。这类模式通过定义对象间的通信方式、责任分配和行为组织,帮助构建可扩展、灵活的系统,并且通过减少耦合和提高复用性来优化系统行为。
常见的行为模式有:
- 责任链模式(Chain of Responsibility)
- 命令模式(Command Pattern)
- 观察者模式(Observer Pattern)
- 策略模式(Strategy Pattern)
- 状态模式(State Pattern)
在这些模式中,责任链模式尤为常见,适用于处理请求时,多个对象可以依次对其进行处理,直到有对象处理完成为止。
1. 责任链模式(Chain of Responsibility Pattern)
原理
责任链模式的核心思想是:将请求沿着一条处理链传递,每个对象有机会处理请求,但不一定必须处理。如果当前对象无法处理,它会将请求传递给下一个对象,直到请求被处理或者到达链的末尾。
- 解耦请求与处理者:客户端发送请求时,不需要关心由谁处理,也不需要关心具体的处理逻辑。处理者可以动态增加或减少,从而使系统更加灵活。
典型使用场景
- 异常的分层处理:异常捕获可以从最底层向上层逐级传播,直到有合适的层次处理这个异常。
- 用户请求的逐层处理:处理用户请求时,从网络层到应用层,每个环节都有机会对请求进行操作,如DNS、HTTP、Socket请求处理等。
- 权限校验:多个权限层次的校验,可以依次判断每个权限层是否满足,直到通过所有校验或者拒绝。
2. Python 中的责任链模式实现
在 Python 中,责任链模式可以通过类继承和方法传递来实现,每个对象负责处理某个具体的任务,或者将请求传递给下一个对象。
示例 1:异常的分层处理
我们可以通过责任链模式逐层捕获和处理异常,从底层向上级抛出,直到有合适的层次处理异常。
class Handler:
def __init__(self, successor=None):
self.successor = successor
def handle(self, request):
if self.successor:
return self.successor.handle(request)
else:
raise Exception("No handler could process the request")
class ConcreteHandlerA(Handler):
def handle(self, request