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生成器的使用方法
Nov 21 Python
详解Python中用于计算指数的exp()方法
May 14 Python
简单实现Python爬取网络图片
Apr 01 Python
python读取文件名并改名字的实例
Jan 07 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
使用python的turtle绘画滑稽脸实例
Nov 21 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
Python OpenCV读取中文路径图像的方法
Jul 02 Python
Python对excel的基本操作方法
Feb 18 Python
python生成随机数、随机字符、随机字符串
Apr 06 Python
使用python求解迷宫问题的三种实现方法
Mar 17 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随机数生成代码与使用实例分析
2011/04/08 PHP
php中 ob_start等函数截取标准输出的方法
2015/06/22 PHP
php制作简单模版引擎
2016/04/07 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
javascript parseInt与Number函数的区别
2010/01/21 Javascript
jquery 插件开发备注
2010/08/27 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
js完美的div拖拽实例代码
2014/01/22 Javascript
JS交换变量的方法
2015/01/21 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
如何让微信小程序页面之间的通信不再变困难
2019/06/03 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
python中反射用法实例
2015/03/27 Python
python批量提取word内信息
2015/08/09 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
2020/04/20 Python
python3爬虫中异步协程的用法
2020/07/10 Python
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
幼儿教师国培感言
2014/02/19 职场文书
科学育儿宣传标语
2014/10/08 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
Python基于Opencv识别两张相似图片
2021/04/25 Python
Django cookie和session的应用场景及如何使用
2021/04/29 Python
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python
在js中修改html body的样式
2021/11/11 Javascript
Python何绘制带有背景色块的折线图
2022/04/23 Python