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安装与使用redis的方法
Apr 19 Python
python xml解析实例详解
Nov 14 Python
Python实现合并excel表格的方法分析
Apr 13 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
Django实现文件上传和下载功能
Oct 06 Python
python flask搭建web应用教程
Nov 19 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
Feb 17 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
Django 后台带有字典的列表数据与页面js交互实例
Apr 03 Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 Python
python 利用panda 实现列联表(交叉表)
Feb 06 Python
Python&Matlab实现灰狼优化算法的示例代码
Mar 21 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 保留小数点
2009/04/21 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
python实现的一个火车票转让信息采集器
2014/07/09 Python
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
python 图片去噪的方法示例
2019/07/09 Python
python实现键盘输入的实操方法
2019/07/16 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
Python pandas库中的isnull()详解
2019/12/26 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
sklearn的predict_proba使用说明
2020/06/28 Python
Python如何将字符串转换为日期
2020/07/31 Python
python基于opencv 实现图像时钟
2021/01/04 Python
美国存储和组织商店:The Container Store
2017/08/16 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
内科护士实习自我鉴定
2013/10/17 职场文书
英语系本科生求职信范文
2013/12/18 职场文书
质检部职责
2013/12/28 职场文书
读群众路线心得体会
2014/03/07 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
分析mysql中一条SQL查询语句是如何执行的
2021/06/21 MySQL