职责模式也称为责任链模式,它将请求的发生在和接受者解耦.客户端不需要知道请求处理者的明确信息和处理的具体逻辑,甚至不需要知道链的结构,它只需要将请求进行发送即可.
场景: 员工->请假--> A领导-->B领导-->C负责人
在设计职责模式的时候,需要注意的点:
- 请求者和请求内容: 确认谁要发送请求,发送请求的对象成为请求者,请求的内容通过发送请求时的参数进行传递.
- 有哪些责任人: 责任人是构成责任链的关键要素.请求的流动方向是链条中的线.而责任人这是链条上的点,线和点共同构成一条链条.
- 对责任人进行抽象: 对责任人进行抽象,使得他们的责任可传递性.
- 责任人可以自由组合:责任链上的责任人可以根据业务的具体逻辑进行自由的组合和排序.
优点:
- 降低耦合度
- 简化了对象
- 增强给对象指派职责的灵活性
- 增加新的处理类很方便
缺点:
- 不能保证请求一定被接收
- 系统的性能会受到一定影响.
应用场景
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求在运行时自动确定
- 请求的处理具体有明显的传递关系
- 请求的处理流程和顺序需要程序运行时动态确定
- 参加的审批流程.
Demo1
class Handle(object):
def __init__(self):
self.successor=""
def setsuccessor(self,successor):
self.successor=successor
def handle_request(self,request):
pass
class ConcreteHandle1(Handle):
def handle_request(self,request):
if request>0 and request<=10:
print("ConcreteHandle1 处理请求:",request)
else:
self.successor.handle_request(request)
class ConcreteHandle2(Handle):
def handle_request(self,request):
if request>10 and request<=20:
print("ConcreteHandle2 处理情况:",request)
else:
self.handle_request(request)
if __name__ == '__main__':
c1=ConcreteHandle1()
c2=ConcreteHandle2()
c1.setsuccessor(c2)
for i in range(5,17):
c1.handle_request(i)