Python的行为设计模式之责任链模式
来源:互联网 发布:淘宝商家找大淘客 编辑:程序博客网 时间:2024/05/17 22:43
这章来讲行为设计模式,关注做事的过程,也就是算法及对象间的交互。首先来看的是责任链模式。
“责任链模式”,可将请求的发送方与处理请求的接收方解耦。
解耦这个词厉害了:两个或者两个以上的体系或两种运动形式间通过相互作用而彼此影响以至于联合起来的现象
意思就是,在几个物体身上发生相似的事件,可以像流水线的形式走完。
常规的方式就是一个基类,然后几个子类,用函数参数套函数的形式来完成责任链。
这里我们来展示一下“基于协程的责任链”。
“协程”与生成器一样,也使用 yield 表达式,但行为却不同。关于 yield 的经典使用,我推荐阅读之前这篇 http://blog.csdn.net/zy_dream/article/details/70336290,你会明白 yield 什么叫“挂起”。
而协程,是一开始就停在首个(或仅有的那个)yield 表达式那里,等着值传过去。一般的都是函数执行到 yield 其才发挥自己的作用。而协程就是先在 yield,再执行。
协程就是这样不断的循环下去,从而达到“链”这个效果,当然在使用的时候,也同样是用函数参数为函数的形式来执行。例子:
pipeline = key_handler(mouse_handler(timer_handler()))while True: event = Event.next() if event.kind == Event.TERMINATE: break pipeline.send(event)通过 send 来推送值。然后把值,这里的 event 传送给 yield ,此时 yield 就相当于接受容器来存放 event,对 event 进行判断:是你的东西还是送给其他人:
@coroutinedef key_handler(successor=None): while True: event = (yield) if event.kind == Event.KEYPRESS: print ("Press: {}".format(event)) elif successor is not None: successor.send(event)@coroutinedef mouse_handler(successor=None): while True: event = (yield) if event.kind == Event.MOUSE: print ("Click: {}".format(event)) elif successor is not None: successor.send(event)@coroutinedef timer_handler(successor=None): while True: event = (yield) if event.kind == Event.TIMER: print ("Time: {}".format(event)) elif successor is not None: successor.send(event)至于修饰器:
def coroutine(function): @function.wraps(function) def wrapper(*args, **kwargs): generator = function(*args, **kwargs) next(generator) return generator return wrapper懂了,有了 coroutine 中的 next() ,才能对 key_handler(mouse_handler(timer_handler())) 进行递归的判断。因为书上说是把生成器对象放入 generator 里面,而生成器对象不就是 event=(yield) 吗。
From in book:
尽管协程的机制与生成器相同,但用法却差别很大,使用一般的生成器时,我们是每次提取一个值出来,例如 for x in range(10): yield x。
而使用协程时,则要每次使用 send() 推送一个值进去。
0 0
- Python的行为设计模式之责任链模式
- java 设计模式-行为模式之责任链模式
- python设计模式之责任链模式
- 【小话设计模式】行为型之责任链模式
- 设计模式-行为型之责任链模式
- 行为型:设计模式之责任链模式(十三)
- Java设计模式(行为型)之-责任链模式
- 行为型设计模式之责任链模式
- Java设计模式之责任链模式的详解(行为模式)
- 设计模式--行为型--责任链模式
- 行为型设计模式-责任链模式
- 行为型设计模式-责任链模式
- 行为模式之责任链模式
- python设计模式之责任链
- 设计模式-行为设计模式:责任链模式 ResponsibilityChain
- GoF23种设计模式之行为型模式之责任链模式
- 二十三种设计模式之行为型模式之责任链模式
- GoF 23个经典的设计模式13--行为模式之 责任链模式(未完代续)
- Coverity 使用手册(1)
- http://www.cnblogs.com/DjangoBlog/category/541903.html
- 使用smtplib发送邮件练习
- java并发编程实战阅读笔记(第三章)对象的共享
- maven创建的工程eclipse 项目-->属性-->为什么没有deployment assembly 按钮呢
- Python的行为设计模式之责任链模式
- iphone7中在块与块之间设置margin-bottom没有撑开,无法实现滚动效果
- cmd进入c盘文件夹
- 关于sql索引的见解
- js时间比较与差值
- 非常漂亮的粒子形状
- Oracle PLS-00103
- ehcarts图表没有显示出来问题
- linux 系统优化参考