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中的exec、eval使用实例
Sep 23 Python
Python素数检测的方法
May 11 Python
python实现给数组按片赋值的方法
Jul 28 Python
Python实现全角半角字符互转的方法
Nov 28 Python
python语言中with as的用法使用详解
Feb 23 Python
django请求返回不同的类型图片json,xml,html的实例
May 22 Python
对Python3之方法的覆盖与super函数详解
Jun 26 Python
Django 5种类型Session使用方法解析
Apr 29 Python
简述python&amp;pytorch 随机种子的实现
Oct 07 Python
python设置中文界面实例方法
Oct 27 Python
理解深度学习之深度学习简介
Apr 14 Python
详解python的异常捕获
Mar 03 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/10/11 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
Yii CDBCriteria常用方法实例小结
2017/01/19 PHP
javascript 类定义的4种方法
2009/09/12 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
javascript数据类型详解
2017/02/07 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
Kotlin学习第一步 kotlin语法特性
2017/05/25 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
python threading模块操作多线程介绍
2015/04/08 Python
Python制作词云的方法
2018/01/03 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
当当网软件测试笔试题
2015/11/24 面试题
客服服务心得体会
2013/12/30 职场文书
生产车间班组长岗位职责
2014/01/06 职场文书
给交警的表扬信
2014/01/12 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
2014年保密工作总结
2014/11/22 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书
vue引入Excel表格插件的方法
2021/04/28 Vue.js