一、内容

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求

直到有一个对象处理它为止

二、角色

  • 抽象处理者
  • 具体处理者
  • 客户端

例:请假部门批准:项目主管----》部门经理----》总经理 

三、优点

  • 降低耦合度:一个对象无需知道是其他哪一个对象处理其请求

四、缺点

  • 请求不保证被接收:链的末端没有处理或者链配置错误

五、适用场景

  • 有多个对象可以处理一个请求,哪个对象处理由时间运行时决定
  • 在不明确接受者的情况下,向多个对象中的一个提交一个请求

六 、示例代码

 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()
模仿js事件处理

 

posted on 2018-02-03 21:20  海燕。  阅读(272)  评论(0编辑  收藏  举报