责任链模式属于:行为型设计模式,所谓行为设计模式即处理系统实体之间通信的设计模式。
责任链模式 – 用于让多个对象处理一个请求时,或者用于预先不知道由哪个对象来处理某种特定请求时,其原则如下:
1、存在一个对象链(链表、树或者其他便捷的数据结构)。
2、一开始将请求发送给第一个对象,让其处理。
3、对象决定是否处理该请求。
4、对象将请求转发给下一个对象。
5、重复该过程,直到达到链尾。
需求
假设有这么一个请假系统:员工若想要请3天以内(包括3天的假),只需要直属经理批准就可以了;如果想请3-7天,不仅需要直属经理批准,部门经理需要最终批准;如果请假大于7天,不光要前两个经理批准,也需要总经理最终批准。类似的系统相信大家都遇到过,那么该如何实现呢?首先想到的当然是if…else…,但一旦遇到需求变动,其臃肿的代码和复杂的耦合缺点都显现出来。简单分析下需求,“假条”在三个经理间是单向传递关系,像一条链条一样,因而,我们可以用一条“链”把他们进行有序连接。
代码示例:
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 Request():
def __init__(self, requestType, requestContent, number=0):
self.requestType = requestType
self.requestContent = requestContent
self.number = number
def commit(self, generalManager):
ret = generalManager.handleRequest(self)
print(ret)
return ret
class LineManager(Manager):
"""直属经理"""
def handleRequest(self, request):
if request.requestType == "DaysOff" and request.number <= 3:
print('%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number))
else:
print("%s:%s Num:%d Accept CONTINE" % (self.name, request.requestContent, request.number))
if self.successor is not None:
self.successor.handleRequest(request)
class DepartmentManager(Manager):
"""部门经理"""
def handleRequest(self, request):
if request.requestType == "DaysOff" and request.number <= 7:
print('%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number))
else:
print("%s:%s Num:%d Accept CONTINE" % (self.name, request.requestContent, request.number))
if self.successor is not None:
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)
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)
输出结果如下:
LINE MANAGER:'Ask 1 day off' Num:1 Accepted OVER
DEPARTMENT MANAGER:'Ask 1 day off' Num:1 Accepted OVER
None
LINE MANAGER:'Ask 5 day off' Num:5 Accept CONTINE
DEPARTMENT MANAGER:'Ask 5 day off' Num:5 Accepted OVER
None
LINE MANAGER:'Ask 10 day off' Num:10 Accept CONTINE
DEPARTMENT MANAGER:'Ask 10 day off' Num:10 Accept CONTINE
None
文章仅为学习记录使用,如有侵权,告知删除