Python设计模式之迭代器模式原理与用法实例分析


Posted in Python onJanuary 10, 2019

本文实例讲述了Python设计模式之迭代器模式原理与用法。分享给大家供大家参考,具体如下:

迭代器模式(Iterator Pattern):提供方法顺序访问一个聚合对象中各元素,而又不暴露该对象的内部表示.

下面是一个迭代器模式的demo:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Andy'
"""
大话设计模式
设计模式——迭代器模式
迭代器模式(Iterator Pattern):提供方法顺序访问一个聚合对象中各元素,而又不暴露该对象的内部表示.
"""
#迭代器抽象类
class Iterator(object):
  def First(self):
    pass
  def Next(self):
    pass
  def Isdone(self):
    pass
  def CurrItem(self):
    pass
#聚集抽象类
class Aggregate(object):
  def CreateIterator(self):
    pass
#具体迭代器类
class ConcreteIterator(Iterator):
  def __init__(self, aggregate):
    self.aggregate = aggregate
    self.curr = 0
  def First(self):
    return self.aggregate[0]
  def Next(self):
    ret = None
    self.curr += 1
    if self.curr < len(self.aggregate):
      ret = self.aggregate[self.curr]
    return ret
  def Isdone(self):
    return True if self.curr+1 >= len(self.aggregate) else False
  def CurrItem(self):
    return self.aggregate[self.curr]
#具体聚集类
class ConcreteAggregate(Aggregate):
  def __init__(self):
    self.ilist = []
  def CreateIterator(self):
    return ConcreteIterator(self)
class ConcreteIteratorDesc(Iterator):
  def __init__(self, aggregate):
    self.aggregate = aggregate
    self.curr = len(aggregate)-1
  def First(self):
    return self.aggregate[-1]
  def Next(self):
    ret = None
    self.curr -= 1
    if self.curr >= 0:
      ret = self.aggregate[self.curr]
    return ret
  def Isdone(self):
    return True if self.curr-1<0 else False
  def CurrItem(self):
    return self.aggregate[self.curr]
if __name__=="__main__":
  ca = ConcreteAggregate()
  ca.ilist.append("大鸟")
  ca.ilist.append("小菜")
  ca.ilist.append("老外")
  ca.ilist.append("小偷")
  itor = ConcreteIterator(ca.ilist)
  print itor.First()
  while not itor.Isdone():
    print itor.Next()
  print "————倒序————"
  itordesc = ConcreteIteratorDesc(ca.ilist)
  print itordesc.First()
  while not itordesc.Isdone():
    print itordesc.Next()

运行结果:

Python设计模式之迭代器模式原理与用法实例分析

上面类的设计如下图:

Python设计模式之迭代器模式原理与用法实例分析

当需要对聚集有多种方式遍历时,可以考虑使用迭代器模式

迭代器模式分离了集合的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合内部结构,又可以让外部代码透明的访问集合内部的数据

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中的日期时间处理详解
Nov 17 Python
python3中dict(字典)的使用方法示例
Mar 22 Python
Python Socket实现简单TCP Server/client功能示例
Aug 05 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 Python
Python实现进程同步和通信的方法
Jan 02 Python
python获取Linux发行版名称
Aug 30 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
Feb 25 Python
Python try except异常捕获机制原理解析
Apr 18 Python
python怎么提高计算速度
Jun 11 Python
python 密码学示例——凯撒密码的实现
Sep 21 Python
Python设计模式之桥接模式原理与用法实例分析
Jan 10 #Python
Python基础教程之异常详解
Jan 10 #Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 #Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
Jan 10 #Python
pandas ix &amp;iloc &amp;loc的区别
Jan 10 #Python
python 移动图片到另外一个文件夹的实例
Jan 10 #Python
python将处理好的图像保存到指定目录下的方法
Jan 10 #Python
You might like
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
js对数字的格式化使用说明
2011/01/12 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
Python datetime包函数简单介绍
2019/08/28 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
Opencv求取连通区域重心实例
2020/06/04 Python
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
经典c++面试题六
2012/01/18 面试题
预备党员思想汇报范文
2014/01/11 职场文书
关于赌博的检讨书
2014/01/24 职场文书
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
需求分析说明书
2014/05/09 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers