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中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
Python装饰器入门学习教程(九步学习)
Jan 28 Python
Python编程实现正则删除命令功能
Aug 30 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
对Python3使运行暂停的方法详解
Feb 18 Python
Python 使用多属性来进行排序
Sep 01 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
基于python判断目录或者文件代码实例
Nov 29 Python
python实现飞船游戏的纵向移动
Apr 24 Python
Python 防止死锁的方法
Jul 29 Python
Python如何使用ElementTree解析xml
Oct 12 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 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
Zend Guard一些常见问题解答
2008/09/11 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
Vue——前端生成二维码的示例
2020/12/19 Vue.js
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
python设置检查点简单实现代码
2014/07/01 Python
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
python实现简单的文字识别
2018/11/27 Python
解析python的局部变量和全局变量
2019/08/15 Python
基于python的docx模块处理word和WPS的docx格式文件方式
2020/02/13 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
小学语文业务学习材料
2014/06/02 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
Go获取两个时区的时间差
2022/04/20 Golang