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实现基于HTTP文件传输实例
Nov 08 Python
更改Python命令行交互提示符的方法
Jan 14 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
May 17 Python
Django中间件工作流程及写法实例代码
Feb 06 Python
python计算日期之间的放假日期
Jun 05 Python
python实现图片识别汽车功能
Nov 30 Python
python面向对象法实现图书管理系统
Apr 19 Python
python flask框架实现传数据到js的方法分析
Jun 11 Python
Python3 itchat实现微信定时发送群消息的实例代码
Jul 12 Python
对Django中内置的User模型实例详解
Aug 16 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
May 25 Python
Flask-SocketIO服务端安装及使用代码示例
Nov 26 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
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
javascript hashtable 修正版 下载
2010/12/30 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
Node.js实现兼容IE789的文件上传进度条
2016/09/02 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
react MPA 多页配置详解
2019/10/18 Javascript
前端开发基础javaScript的六大作用
2020/08/06 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
nuxt.js写项目时增加错误提示页面操作
2020/11/05 Javascript
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
Python入门之三角函数atan2()函数详解
2017/11/08 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
人工神经网络算法知识点总结
2019/06/11 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
草莓巧克力:Shari’s Berries
2017/02/07 全球购物
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
PHP经典面试题
2016/09/03 面试题
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
合作意向书范本
2014/03/31 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
毕业生自荐材料范文
2014/12/30 职场文书
python实现A*寻路算法
2021/06/13 Python
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS