使用Python实现职责链模式
职责链模式是一种行为设计模式,用于将请求的发送者和接收者解耦,每个接收者都包含了对请求的处理逻辑并能决定是否将请求继续传递到下一个接收者。
下面是使用Python实现职责链模式的完整样例代码:
python
class Handler:
def __init__(self, successor=None):
self.successor = successor
def handle(self, request):
handled = self._handle(request)
if not handled and self.successor:
self.successor.handle(request)
def _handle(self, request):
raise NotImplementedError('Must provide implementation in subclass')
class ConcreteHandler1(Handler):
def _handle(self, request):
if 0 < request <= 10:
print(f'Request {request} handled by ConcreteHandler1')
return True
return False
class ConcreteHandler2(Handler):
def _handle(self, request):
if 10 < request <= 20:
print(f'Request {request} handled by ConcreteHandler2')
return True
return False
class ConcreteHandler3(Handler):
def _handle(self, request):
if 20 < request <= 30:
print(f'Request {request} handled by ConcreteHandler3')
return True
return False
class DefaultHandler(Handler):
def _handle(self, request):
print(f'End of chain, no handler for {request}')
return True
def main():
handler1 = ConcreteHandler1()
handler2 = ConcreteHandler2()
handler3 = ConcreteHandler3()
default_handler = DefaultHandler()
handler1.successor = handler2
handler2.successor = handler3
handler3.successor = default_handler
requests = [1, 15, 25, 40]
for request in requests:
handler1.handle(request)
if __name__ == '__main__':
main()
该代码定义了一个抽象基类`Handler`,所有具体处理器都需要继承它,并实现`_handle()`方法来处理请求。`Handler`类还包含了一个`handle()`方法,在该方法中它首先调用`_handle()`方法来处理请求,如果请求没有被处理并且当前处理器有后继处理器,则调用后继处理器的`handle()`方法,依次传递请求。
具体处理器类`ConcreteHandler1`、`ConcreteHandler2`和`ConcreteHandler3`分别处理范围在1-10、11-20和21-30之间的请求。`DefaultHandler`是一个默认处理器,在职责链的末尾,它会处理任意请求。
在`main()`函数中,我们创建了以上的处理器实例并设置好它们的后继处理器,然后创建一系列的请求进行测试。运行该代码后,输出结果为:
Request 1 handled by ConcreteHandler1
Request 15 handled by ConcreteHandler2
Request 25 handled by ConcreteHandler3
End of chain, no handler for 40
可以看到,对于不同范围内的请求,它们被正确地传递到了相应的处理器来处理。而对于超出全部范围的请求,被`DefaultHandler`默认处理器处理。