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处理二进制数据的方法
Jun 03 Python
python kmeans聚类简单介绍和实现代码
Feb 23 Python
python单例模式实例解析
Aug 28 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
python实现根据文件关键字进行切分为多个文件的示例
Dec 10 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
Python中 Global和Nonlocal的用法详解
Jan 20 Python
Python变量作用域LEGB用法解析
Feb 04 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 Python
Django Haystack 全文检索与关键词高亮的实现
Feb 17 Python
使用Python获取字典键对应值的方法
Apr 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
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
JavaScript 语言的递归编程
2010/05/18 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
PHP+jQuery+Ajax实现多图片上传效果
2015/03/14 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
vue-router 起步步骤详解
2019/03/26 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
老生常谈Python序列化和反序列化
2017/06/28 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
python sorted方法和列表使用解析
2019/11/18 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
python 如何实现遗传算法
2020/09/22 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
学生实习推荐信范文
2013/11/26 职场文书
物流管理系毕业生求职信
2014/06/03 职场文书
外贸业务员求职信
2014/06/16 职场文书
女生节标语
2014/06/26 职场文书
2014年作风建设剖析材料
2014/10/23 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
python热力图实现的完整实例
2022/06/25 Python