责任链模式:
它允许多个对象都有机会处理请求,将请求沿着一个链传递,直到有一个对象处理请求为止。责任链模式可以避免请求发送者和接收者之间的耦合关系,从而使得多个对象都有机会处理请求。
用于让多个对象处理一个请求时,或者用于预先不知道由哪个对象来处理某种特定请求时,其原则如下:
1、存在一个对象链(链表、树或者其他便捷的数据结构)。
2、一开始将请求发送给第一个对象,让其处理。
3、对象决定是否处理该请求。
4、对象将请求转发给下一个对象。
5、重复该过程,直到达到链尾。
代码:
使用责任链模式处理一个数字,将其分别转换成整数、浮点数和字符串三种类型。
# 抽象处理器
class Handler:
def __init__(self):
self.next_handler = None
def handle(self, request):
pass
def set_next(self, handler):
self.next_handler = handler
return handler
# 具体处理器1:处理整数
class IntHandler(Handler):
def handle(self, request):
if isinstance(request, int):
print(f"{request} is an integer.")
elif self.next_handler:
self.next_handler.handle(request)
# 具体处理器2:处理浮点数
class FloatHandler(Handler):
def handle(self, request):
if isinstance(request, float):
print(f"{request} is a float.")
elif self.next_handler:
self.next_handler.handle(request)
# 具体处理器3:处理字符串
class StrHandler(Handler):
def handle(self, request):
if isinstance(request, str):
print(f"{request} is a string.")
elif self.next_handler:
self.next_handler.handle(request)
# 客户端
handler = IntHandler()
handler.set_next(FloatHandler()).set_next(StrHandler())
handler.handle(10)
handler.handle(3.14)
handler.handle('Hello World')
该模式的优缺点:
优点:
1、将请求者与处理者分离,请求者并不知道请求是被哪个处理者所处理,易于扩展。
缺点:
1、如果责任链比较长,会有比较大的性能问题;
2、如果责任链比较长,若业务出现问题,比较难定位是哪个处理者的问题。
应用场景:
2、若一个请求可能由一个对请求有链式优先级的处理群所处理时,可以考虑责任链模式。除本例外,银行的客户请求处理系统也可以用责任链模式实现(VIP客户和普通用户处理方式当然会有不同)。