Python版

https://github.com/faif/python-patterns/blob/master/behavioral/chain.py

#!/usr/bin/env python
# -*- coding: utf-8 -*- """
http://www.dabeaz.com/coroutines/
""" from contextlib import contextmanager
import os
import sys
import time
import abc class Handler(object):
__metaclass__ = abc.ABCMeta def __init__(self, successor=None):
self._successor = successor def handle(self, request):
res = self._handle(request)
if not res:
self._successor.handle(request) @abc.abstractmethod
def _handle(self, request):
raise NotImplementedError('Must provide implementation in subclass.') class ConcreteHandler1(Handler): def _handle(self, request):
if 0 < request <= 10:
print('request {} handled in handler 1'.format(request))
return True class ConcreteHandler2(Handler): def _handle(self, request):
if 10 < request <= 20:
print('request {} handled in handler 2'.format(request))
return True class ConcreteHandler3(Handler): def _handle(self, request):
if 20 < request <= 30:
print('request {} handled in handler 3'.format(request))
return True class DefaultHandler(Handler): def _handle(self, request):
print('end of chain, no handler for {}'.format(request))
return True class Client(object): def __init__(self):
self.handler = ConcreteHandler1(
ConcreteHandler3(ConcreteHandler2(DefaultHandler()))) def delegate(self, requests):
for request in requests:
self.handler.handle(request) def coroutine(func):
def start(*args, **kwargs):
cr = func(*args, **kwargs)
next(cr)
return cr
return start @coroutine
def coroutine1(target):
while True:
request = yield
if 0 < request <= 10:
print('request {} handled in coroutine 1'.format(request))
else:
target.send(request) @coroutine
def coroutine2(target):
while True:
request = yield
if 10 < request <= 20:
print('request {} handled in coroutine 2'.format(request))
else:
target.send(request) @coroutine
def coroutine3(target):
while True:
request = yield
if 20 < request <= 30:
print('request {} handled in coroutine 3'.format(request))
else:
target.send(request) @coroutine
def default_coroutine():
while True:
request = yield
print('end of chain, no coroutine for {}'.format(request)) class ClientCoroutine: def __init__(self):
self.target = coroutine1(coroutine3(coroutine2(default_coroutine()))) def delegate(self, requests):
for request in requests:
self.target.send(request) def timeit(func): def count(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
count._time = time.time() - start
return res
return count @contextmanager
def suppress_stdout():
try:
stdout, sys.stdout = sys.stdout, open(os.devnull, 'w')
yield
finally:
sys.stdout = stdout if __name__ == "__main__":
client1 = Client()
client2 = ClientCoroutine()
requests = [2, 5, 14, 22, 18, 3, 35, 27, 20] client1.delegate(requests)
print('-' * 30)
client2.delegate(requests) requests *= 10000
client1_delegate = timeit(client1.delegate)
client2_delegate = timeit(client2.delegate)
with suppress_stdout():
client1_delegate(requests)
client2_delegate(requests)
# lets check which is faster
print(client1_delegate._time, client2_delegate._time) ### OUTPUT ###
# request 2 handled in handler 1
# request 5 handled in handler 1
# request 14 handled in handler 2
# request 22 handled in handler 3
# request 18 handled in handler 2
# request 3 handled in handler 1
# end of chain, no handler for 35
# request 27 handled in handler 3
# request 20 handled in handler 2
# ------------------------------
# request 2 handled in coroutine 1
# request 5 handled in coroutine 1
# request 14 handled in coroutine 2
# request 22 handled in coroutine 3
# request 18 handled in coroutine 2
# request 3 handled in coroutine 1
# end of chain, no coroutine for 35
# request 27 handled in coroutine 3
# request 20 handled in coroutine 2
# (0.2369999885559082, 0.16199994087219238)

Python版

最新文章

  1. sharepoint2013的最少下载策略概述(MDS)
  2. WCF入门(十二)---WCF异常处理
  3. hiberante中get和load方法的区别
  4. 图解SVD分解
  5. OOCSS学习(二)
  6. #include &lt;array&gt;
  7. //相当于深拷贝一份dataArray。这样才不会改变dataArray本身的值
  8. NET MVC过滤器
  9. String类重写
  10. Zeppelin0.5.6使用hive解释器
  11. Eclipse导入Android签名
  12. SpringMVC 3.2集成Spring Security 3.2集成mybaties
  13. SpringMVC 视图解析器
  14. Android中Sqlite数据库进行增删改查
  15. SQL server SELECT 语句的基本结构
  16. 使用Java命令行方式导入第三方jar包来运行Java程序的命令
  17. File类_构造函数
  18. 10个HTML5美化版复选框和单选框
  19. js基础-运算符
  20. Winniechen’s test1

热门文章

  1. 【CVE-2020-1948】Apache Dubbo Provider反序列化漏洞复现
  2. 使用Adobe Acrobat进行Word转PDF遇到的问题及解决方法
  3. RabbitMQ(六)消息幂等性处理
  4. Java 初始化与清理
  5. Python 数据类型常用的内置方法(三)
  6. [luogu5564]Say Goodbye
  7. [bzoj1082]栅栏
  8. [loj3313]序列
  9. spring security 认证源码跟踪
  10. 6.K8s集群升级、etcd备份和恢复、资源对象及其yaml文件使用总结、常用维护命令