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 相关文章推荐
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
Jun 13 Python
Python实现的生成格雷码功能示例
Jan 24 Python
python使用socket创建tcp服务器和客户端
Apr 12 Python
python3使用smtplib实现发送邮件功能
May 22 Python
Python if语句知识点用法总结
Jun 10 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
kafka监控获取指定topic的消息总量示例
Dec 23 Python
Python实现名片管理系统
Feb 14 Python
浅谈keras中loss与val_loss的关系
Jun 22 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
python os.rename实例用法详解
Dec 06 Python
pytest配置文件pytest.ini的详细使用
Apr 17 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
Zend的Registry机制的使用说明
2013/05/02 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
linux下为php添加iconv模块的方法
2016/02/28 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
return false;和e.preventDefault();的区别
2010/07/11 Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
JS实现队列的先进先出功能示例
2017/05/10 Javascript
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
2017/05/13 NodeJs
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
Angular5集成eventbus的示例代码
2018/07/19 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
python计算文本文件行数的方法
2015/07/06 Python
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
python使用mysql数据库示例代码
2017/05/21 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
实例详解Python装饰器与闭包
2019/07/29 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
Python-split()函数实例用法讲解
2020/12/18 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
全球在线商店:BerryLook
2019/04/14 全球购物
医大实习自我鉴定
2013/12/07 职场文书
尊师重教演讲稿
2014/09/04 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
物流业务员岗位职责
2015/04/03 职场文书
MongoDB使用profile分析慢查询的步骤
2021/04/30 MongoDB
JS代码编译器Monaco使用方法
2021/06/11 Javascript
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers