行为型设计模式-责任链(chain of responsibility)模式-python实现
设计模式汇总:查看
通俗示例
想象一下你在一个客服中心工作,当一个客户的问题提交给客服中心时,这个问题可能会被第一个可用的客服人员处理。如果这位客服人员无法解决问题,那么问题会被转发给更高级别的客服。这个过程可能会一直持续到问题被解决或者达到最高级别的支持。这种处理问题的方式就是一个责任链的例子。
通俗解释
责任链模式是一种行为型设计模式,它允许将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。在责任链模式中,多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它或者请求到达链的末端。
责任链模式的组成包括:
- 处理者(Handler):定义处理请求的接口,通常还包含一个指向下一个处理者的引用。
- 具体处理者(Concrete Handler):处理它所负责的请求,如果无法处理,则将请求传递给链中的下一个处理者。
责任链模式的优点
- 降低耦合度:请求的发送者和接收者之间无需知道对方的详细信息。
- 增加灵活性:可以动态地添加或者删除处理者,无需修改现有代码。
- 增强可扩展性:可以很容易地扩展新的处理者类。
Python代码示例
以下是一个责任链模式的简单实现:
class Manager:
"""经理类"""
successor = None
name = ''
def __init__(self, name):
self.name = name
def setSuccessor(self, successor):
# 设置上级
self.successor = successor
def handleRequest(self, request):
# 处理请求
pass
class LineManager(Manager):
"""直属经理"""
def handleRequest(self, request):
if request.requestType == 'DaysOff' and request.number <= 3:
return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)
else:
print('%s:%s Num:%d Accepted CONTINUE' % (self.name, request.requestContent, request.number))
if self.successor is not None:
return self.successor.handleRequest(request)
class DepartmentManager(Manager):
"""部门经理"""
def handleRequest(self, request):
if request.requestType == 'DaysOff' and request.number <= 7:
return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)
else:
print('%s:%s Num:%d Accepted CONTINUE' % (self.name, request.requestContent, request.number))
if self.successor is not None:
return self.successor.handleRequest(request)
class GeneralManager(Manager):
"""总经理"""
def handleRequest(self, request):
if request.requestType == 'DaysOff':
return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)
class Request:
"""
请求类,用于封装请求信息和处理请求。
Attributes:
requestType: 请求的类型。
requestContent: 请求的内容。
number: 请求的编号,默认为0。
"""
def __init__(self, requestType, requestContent, number=0):
"""
初始化请求对象。
Args:
requestType: 请求的类型。
requestContent: 请求的内容。
number: 请求的编号,默认为0。
"""
self.requestType = requestType
self.requestContent = requestContent
self.number = number
def commit(self, generalManager):
"""
提交请求,由请求者调用,将请求交给管理者处理。
Args:
generalManager: 管理者对象,用于处理请求。
Returns:
处理请求后的返回值。
"""
ret = generalManager.handleRequest(self)
print(ret)
return ret
# 当模块作为主程序运行时,以下代码块将被执行
if __name__ == '__main__':
# 创建一线经理、部门经理和总经理的实例
line_manager = LineManager('LINE MANAGER')
department_manager = DepartmentManager('DEPARTMENT MANAGER')
general_manager = GeneralManager('GENERAL MANAGER')
# 设置一线经理的继任者为部门经理,部门经理的继任者为总经理
line_manager.setSuccessor(department_manager)
department_manager.setSuccessor(general_manager)
# 创建请假申请实例并提交给一线经理审批
# 申请一天假期
request = Request(requestContent="'Ask 1 day off'", requestType='DaysOff', number=1)
request.commit(line_manager)
# 创建请假申请实例并提交给一线经理审批
# 申请五天假期
request = Request(requestContent="'Ask 5 day off'", requestType='DaysOff', number=5)
request.commit(line_manager)
# 创建请假申请实例并提交给一线经理审批
# 申请十天假期
request = Request(requestContent="'Ask 10 day off'", requestType='DaysOff', number=10)
request.commit(line_manager)
总结
责任链模式通过将请求的发送者和接收者解耦,允许动态地构建处理者链,使得请求可以在多个对象之间传递,直到被处理。这种方式特别适用于那些需要多个对象共同处理一个请求的场景,比如异常处理、工作流处理等。