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挑选文件夹里宽大于300图片的方法
Mar 05 Python
Python使用metaclass实现Singleton模式的方法
May 05 Python
Python 多进程和数据传递的理解
Oct 09 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
Python程序员面试题 你必须提前准备!(答案及解析)
Jan 23 Python
单链表反转python实现代码示例
Feb 08 Python
python中abs&amp;map&amp;reduce简介
Feb 20 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 Python
pytorch构建多模型实例
Jan 15 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 Python
关于 Python json中load和loads区别
Nov 07 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多种序列化与反序列化的方法
2013/06/06 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
javascript 实用的文字链提示框效果
2010/06/30 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
python字典序问题实例
2014/09/26 Python
详解python进行mp3格式判断
2016/12/23 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
英语系本科生个人求职信
2013/09/21 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
会计求职自荐信
2014/06/20 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
高老头读书笔记
2015/06/30 职场文书
宾馆安全管理制度
2015/08/06 职场文书
导游词之麻姑仙境
2019/11/18 职场文书
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS
python 远程执行命令的详细代码
2022/02/15 Python
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫