Python使用设计模式中的责任链模式与迭代器模式的示例


Posted in Python onMarch 02, 2016

责任链模式

责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系。

#encoding=utf-8 
# 
#by panda 
#职责连模式 
 
def printInfo(info): 
  print unicode(info, 'utf-8').encode('gbk') 
 
#抽象职责类 
class Manager(): 
  successor = None 
  name = '' 
  def __init__(self, name): 
    self.name = name 
   
  def SetSuccessor(self, successor): 
    self.successor = successor 
   
  def HandleRequest(self, request): 
    pass 
 
#具体职责类:经理 
class CommonManager(Manager): 
  def HandleRequest(self, request): 
    if request.RequestType == '请假' and request.Number <= 2: 
      printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
    else: 
      if self.successor != None: 
        self.successor.HandleRequest(request) 
         
#具体职责类:总监 
class Majordomo(Manager): 
  def HandleRequest(self, request): 
    if request.RequestType == '请假' and request.Number <= 5: 
      printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
    else: 
      if self.successor != None: 
        self.successor.HandleRequest(request) 
 
#具体职责类:总经理 
class GeneralManager(Manager): 
  def HandleRequest(self, request): 
    if request.RequestType == '请假': 
      printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
    elif request.RequestType == '加薪' and request.Number <= 500: 
      printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
    elif request.RequestType == '加薪' and request.Number > 500: 
      printInfo('%s:%s 数量%d 再说吧' % (self.name, request.RequestContent, request.Number)) 
 
class Request(): 
  RequestType = '' 
  RequestContent = '' 
  Number = 0 
 
def clientUI(): 
  jinLi = CommonManager('金力') 
  zongJian = Majordomo('宗健') 
  zhongJingLi = GeneralManager('钟金利') 
   
  jinLi.SetSuccessor(zongJian) 
  zongJian.SetSuccessor(zhongJingLi) 
   
  request = Request() 
  request.RequestType = '请假' 
  request.RequestContent = '小菜请假' 
  request.Number = 1 
  jinLi.HandleRequest(request) 
   
  request.RequestType = '请假' 
  request.RequestContent = '小菜请假' 
  request.Number = 5 
  jinLi.HandleRequest(request) 
   
  request.RequestType = '加薪' 
  request.RequestContent = '小菜要求加薪' 
  request.Number = 500 
  jinLi.HandleRequest(request) 
   
  request.RequestType = '加薪' 
  request.RequestContent = '小菜要求加薪' 
  request.Number = 1000 
  jinLi.HandleRequest(request) 
  return 
 
if __name__ == '__main__': 
  clientUI();

类图:

Python使用设计模式中的责任链模式与迭代器模式的示例

迭代器模式
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

python内置支持这种模式,所以一般来说,不用自己写,

#encoding=utf-8 
# 
#by panda 
#迭代器(Iterator)模式 
 
def printInfo(info): 
  print unicode(info, 'utf-8').encode('gbk') 
 
#迭代器抽象类 
class Iterator: 
  def First(self): 
    pass 
   
  def Next(self): 
    pass 
   
  def IsDone(self): 
    pass 
   
  def CurrentItem(self): 
    pass 
   
#集合抽象类 
class Aggregate: 
  def CreateIterator(self): 
    pass 
   
#具体迭代器类: 
class ConcreteIterator(Iterator): 
  aggregate = None 
  current = 0 
  def __init__(self, aggregate): 
    self.aggregate = aggregate 
    self.current = 0 
   
  def First(self): 
    return self.aggregate[0] 
 
  def Next(self): 
    ret = None 
    self.current += 1 
    if(self.current < len(self.aggregate)): 
      ret = self.aggregate[self.current] 
    return ret 
 
  def IsDone(self): 
    if(self.current < len(self.aggregate)): 
      return False 
    else: 
      return True 
 
  def CurrentItem(self): 
    ret = None 
    if(self.current < len(self.aggregate)): 
      ret = self.aggregate[self.current] 
    return ret 
   
#具体集合类 
class ConcreteAggregate(Aggregate): 
  items = None 
  def __init__(self): 
    self.items = []     
   
def clientUI(): 
  a = ConcreteAggregate() 
  a.items.append('大鸟') 
  a.items.append('小菜') 
  a.items.append('行李') 
  a.items.append('老外') 
  a.items.append('公交内部员工') 
  a.items.append('小偷') 
   
   
  printInfo('---------迭代器模式-------------') 
  i = ConcreteIterator(a.items) 
  item = i.First() 
  while(False == i.IsDone()): 
    printInfo("%s 请买车票!" % i.CurrentItem()); 
    i.Next() 
     
  printInfo('\n---------python内部迭代-------------') 
  for item in a.items: 
    printInfo("%s 请买车票!" % item); 
  return 
 
if __name__ == '__main__': 
  clientUI();

类图:

Python使用设计模式中的责任链模式与迭代器模式的示例

Python 相关文章推荐
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
Python利用flask sqlalchemy实现分页效果
Aug 02 Python
对python list 遍历删除的正确方法详解
Jun 29 Python
对Python中plt的画图函数详解
Nov 07 Python
python+mysql实现教务管理系统
Feb 20 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
python可视化篇之流式数据监控的实现
Aug 07 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
Dec 03 Python
jupyter notebook清除输出方式
Apr 10 Python
基于python调用jenkins-cli实现快速发布
Aug 14 Python
Python selenium实现断言3种方法解析
Sep 08 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 Python
详解Python设计模式编程中观察者模式与策略模式的运用
Mar 02 #Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 #Python
分析Python中设计模式之Decorator装饰器模式的要点
Mar 02 #Python
实例解析Python设计模式编程之桥接模式的运用
Mar 02 #Python
Python随机生成带特殊字符的密码
Mar 02 #Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 #Python
Python打造出适合自己的定制化Eclipse IDE
Mar 02 #Python
You might like
php去除HTML标签实例
2013/11/06 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
JS获取表格内指定单元格html内容的方法
2015/03/31 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
python安装numpy&amp;安装matplotlib&amp; scipy的教程
2017/11/02 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
python实现公司年会抽奖程序
2019/01/22 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
python中format函数如何使用
2020/06/22 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
4款Python 类型检查工具,你选择哪个呢?
2020/10/30 Python
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
IRO美国官网:法国服装品牌
2018/03/06 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
承认错误的检讨书
2014/01/30 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
三八妇女节标语
2014/10/09 职场文书
百年校庆感言
2015/08/01 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python