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 Web框架Flask信号机制(signals)介绍
Jan 01 Python
Python与Redis的连接教程
Apr 22 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
python 线程的暂停, 恢复, 退出详解及实例
Dec 06 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
基于python实现简单日历
Jul 28 Python
pyqt5 从本地选择图片 并显示在label上的实例
Jun 13 Python
Pandas分组与排序的实现
Jul 23 Python
python爬虫 urllib模块url编码处理详解
Aug 20 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
Jan 22 Python
解决pyqt5异常退出无提示信息的问题
Apr 08 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实现的生成静态HTML速度快类库
2007/03/31 PHP
PHP IPV6正则表达式验证代码
2010/02/16 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
浅析PHP绘图技术
2013/07/03 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
python使用mailbox打印电子邮件的方法
2015/04/30 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
软件缺陷的分类都有哪些
2014/08/22 面试题
护理学毕业生求职信
2013/11/14 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
公司庆典欢迎词
2015/01/26 职场文书
冰峪沟导游词
2015/02/09 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书