一、内容
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求
直到有一个对象处理它为止
二、角色
- 抽象处理者
- 具体处理者
- 客户端
例:请假部门批准:项目主管----》部门经理----》总经理
三、优点
- 降低耦合度:一个对象无需知道是其他哪一个对象处理其请求
四、缺点
- 请求不保证被接收:链的末端没有处理或者链配置错误
五、适用场景
- 有多个对象可以处理一个请求,哪个对象处理由时间运行时决定
- 在不明确接受者的情况下,向多个对象中的一个提交一个请求
六 、示例代码
1 from abc import ABCMeta, abstractmethod 2 # 3 class Handler(metaclass=ABCMeta): 4 @abstractmethod 5 def handle_leave(self, day): 6 pass 7 8 9 class GeneralManagerHandler(Handler): 10 def handle_leave(self, day): 11 if day < 10: 12 print("总经理批准%d天假"%day) 13 else: 14 print("呵呵") 15 16 17 class DepartmentManagerHandler(Handler): 18 def __init__(self): 19 self.successor = GeneralManagerHandler() #责任链的后面的一个人 20 def handle_leave(self, day): 21 if day < 7: 22 print("部门经理批准%d天假"%day) 23 else: 24 print("部门经理无权准假") 25 self.successor.handle_leave(day) 26 27 28 class ProjectDirectorHandler(Handler): 29 def __init__(self): 30 self.successor = DepartmentManagerHandler() 31 def handle_leave(self, day): 32 if day < 3: 33 print("项目主管批准%d天假") 34 else: 35 print("项目主管无权准假") 36 self.successor.handle_leave(day) 37 38 39 day = 4 40 h = ProjectDirectorHandler() 41 h.handle_leave(day)
1 #--高级例子--模仿js事件处理 2 # JavaScript中假如有三个嵌套的div,每个div绑定一个事件,就像冒泡一样,先找里面的, 3 # 如果里面有就是里面的事件,如果里面没有就找上一层的。以此类推 4 from abc import ABCMeta, abstractmethod 5 class Handler(metaclass=ABCMeta): 6 @abstractmethod 7 def add_event(self, func): 8 pass 9 10 @abstractmethod 11 def handle(self): 12 pass 13 14 15 class BodyHandler(Handler): 16 def __init__(self): 17 self.func = None 18 19 def add_event(self, func): 20 self.func = func 21 22 def handle(self): 23 if self.func: 24 return self.func() 25 else: 26 print("已到最后一级,无法处理") 27 28 29 class ElementHandler(Handler): 30 def __init__(self, successor): 31 self.func = None 32 self.successor = successor 33 34 def add_event(self, func): 35 self.func = func 36 37 def handle(self): 38 if self.func: 39 return self.func() 40 else: 41 return self.successor.handle() 42 43 44 # 客户端 45 # <body><div><a> 46 47 body = {'type': 'body', 'name': 'body', 'children': [], 'father': None} 48 49 div = {'type': 'div', 'name': 'div', 'children': [], 'father': body} 50 51 a = {'type': 'a', 'name': 'a', 'children': [], 'father': div} 52 53 body['children'].append(div) 54 div['children'].append(a) 55 56 body['event_handler'] = BodyHandler() 57 div['event_handler'] = ElementHandler(div['father']['event_handler']) 58 a['event_handler'] = ElementHandler(a['father']['event_handler']) 59 60 61 def attach_event(element, func): 62 element['event_handler'].add_event(func) 63 64 #test 65 66 def func_div(): 67 print("这是给div的函数") 68 69 def func_a(): 70 print("这是给a的函数") 71 72 def func_body(): 73 print("这是给body的函数") 74 75 # attach_event(div, func_div) 76 attach_event(a, func_a) 77 # attach_event(body, func_body) 78 a['event_handler'].handle()