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 文件操作实现代码
Oct 07 Python
netbeans7安装python插件的方法图解
Dec 24 Python
深入理解Python中变量赋值的问题
Jan 12 Python
Python面向对象编程之继承与多态详解
Jan 16 Python
python @property的用法及含义全面解析
Feb 01 Python
Python模拟登录的多种方法(四种)
Jun 01 Python
python实现Flappy Bird源码
Dec 24 Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 Python
jupyter notebook 实现matplotlib图动态刷新
Apr 22 Python
记一次django内存异常排查及解决方法
Aug 07 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
Python的Tqdm模块实现进度条配置
Feb 24 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实现获取域名的方法小结
2014/11/05 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
jquery.messager.js插件导致页面抖动的解决方法
2013/07/14 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
js闭包用法实例详解
2016/12/13 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
2018/05/09 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
Python获取远程文件大小的函数代码分享
2014/05/13 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
车间调度岗位职责
2013/11/30 职场文书
学校七一活动方案
2014/01/19 职场文书
庆八一活动方案
2014/01/25 职场文书
数控个人求职信范文
2014/02/03 职场文书
物理教学随笔感言
2014/02/22 职场文书
小学庆六一活动总结
2014/08/28 职场文书
小学生运动会报道稿
2014/09/12 职场文书
同学聚会邀请函
2015/01/30 职场文书
2015年材料员工作总结
2015/04/30 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
班级联欢会主持词
2015/07/03 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL