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脚本设置系统时间的两种方法
Feb 21 Python
python实现12306火车票查询器
Apr 20 Python
Python算法输出1-9数组形成的结果为100的所有运算式
Nov 03 Python
python自动查询12306余票并发送邮箱提醒脚本
May 21 Python
在NumPy中创建空数组/矩阵的方法
Jun 15 Python
python实现自动发送邮件
Jun 20 Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
jupyter notebook 增加kernel教程
Apr 10 Python
pycharm 关掉syntax检查操作
Jun 09 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
Jul 13 Python
python绘制雷达图实例讲解
Jan 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
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
MySQL连接数超过限制的解决方法
2011/07/17 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
2012/10/11 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
简单分析javascript中的函数
2016/09/10 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
Python中操作MySQL入门实例
2015/02/08 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
Python模块WSGI使用详解
2018/02/02 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
C,C++的几个面试题小集
2013/07/13 面试题
剪彩仪式主持词
2014/03/19 职场文书
银行金融服务方案
2014/06/11 职场文书
物业管理专业自荐信
2014/07/01 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
高三物理教学反思
2016/02/20 职场文书
2019银行竞聘书
2019/06/21 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript