博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
责任链模式
阅读量:4603 次
发布时间:2019-06-09

本文共 3213 字,大约阅读时间需要 10 分钟。

一、内容

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

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

二、角色

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

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

三、优点

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

四、缺点

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

五、适用场景

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

六 、示例代码

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 = 440 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     @abstractmethod11     def handle(self):12         pass13 14 15 class BodyHandler(Handler):16     def __init__(self):17         self.func = None18 19     def add_event(self, func):20         self.func = func21 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 = None32         self.successor = successor33 34     def add_event(self, func):35         self.func = func36 37     def handle(self):38         if self.func:39             return self.func()40         else:41             return self.successor.handle()42 43 44 # 客户端45 # 
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 #test65 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事件处理

 

转载于:https://www.cnblogs.com/morgana/p/8496298.html

你可能感兴趣的文章
python小兵之时间模块
查看>>
线条与线条之间连接的样式
查看>>
正则表达式-元字符
查看>>
python基础
查看>>
django建表
查看>>
1.CSS简介
查看>>
判断数字并不允许输入
查看>>
坐得越久 死得越快
查看>>
Tensorflow中张量数据类型的转换
查看>>
关于梯度消失,梯度爆炸的问题
查看>>
GDI 总结三: CImage类使用
查看>>
新安装Win10
查看>>
23种设计模式(5):原型模式
查看>>
Android编程之LayoutInflater的inflate方法具体解释
查看>>
hdfs操作手册
查看>>
C语言2——指针
查看>>
[bzoj1060] [ZJOI2007]时态同步
查看>>
java执行jar包
查看>>
谈谈个人网站的建立(一)——建站历史和技术架构
查看>>
设计模式 关注点分离
查看>>