迭代器模式(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()

上面类的设计如下图:

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

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

作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

大话设计模式Python实现-迭代器模式的更多相关文章

  1. 大话设计模式Python实现-解释器模式

    解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 下面是一个解释器模式的demo: #!/usr/ ...

  2. 大话设计模式Python实现-命令模式

    命令模式(Command Pattern):将请求封装成对象,从而使可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 下面是一个命令模式的demo: #!/usr/bi ...

  3. 大话设计模式Python实现-桥接模式

    桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化. 下面是一个桥接模式的demo: #!/usr/bin/env python # -*- coding: ...

  4. 大话设计模式Python实现-组合模式

    组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 下面是一个组合模式的demo: #!/us ...

  5. 大话设计模式Python实现-备忘录模式

    备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样已经后就可将该对象恢复到原先保存的状态 下面是一个备忘录模式的demo: #! ...

  6. 大话设计模式Python实现-状态模式

    状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 下面是一个状态模式的demo: #!/usr/bin/env python # -*- ...

  7. 大话设计模式Python实现-建造者模式

    建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 下面是一个建造者模式的demo #!/usr/bin/env python # ...

  8. 大话设计模式Python实现-外观模式

    外观模式(Facade Pattern):为子系统中的一组接口提供一个一致界面,此模式定义一个高层接口,使得子系统更加容易使用 下面是一个外观模式的demo: #!/usr/bin/env pytho ...

  9. 大话设计模式Python实现-模板方法模式

    模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 下面是一个模 ...

随机推荐

  1. 计算购物车金额总和( jquery )

    今天简单写了一个jq版购物车计算金额总和的例子,如图: 整体页面代码如下: <!DOCTYPE html> <html> <head> <meta chars ...

  2. cmd for install pygame in python 3.7

    Higher version Python better and convinient to use! Down load pygame whl file: C:\Work\software>p ...

  3. Tomcat连接器详解

    1.连接器等同于nginx中的引擎. 2.tomcat连接器有三种运行模式bio.nio.apr . (1)bio(blocking I/O,阻塞式I/O操作) 1)表示tomcat使用的是传统的ja ...

  4. c语言l博客作业03

    问题 答案 这个作业属于哪个课程 c语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-3/homework/8727 我在这 ...

  5. php踩过的那些坑(3) 数据类型转换

    一.前方有坑 php属于弱类型语言,不会强迫工程师在使用变量之前先声明变量类型,开发时爽了,但是也带来不少的坑.下面就举一个坑的例子: 例1: $str = ‘haodaquan'; echo ($s ...

  6. 腾讯面试官问我Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知

    本文首发于微信公众号:程序员乔戈里 什么是boolean类型,根据官方文档的描述: boolean: The boolean data type has only two possible value ...

  7. 鲲鹏云实验-Python+Jupyter机器学习基础环境

    [摘要] 介绍Ubuntu 18.04环境下Python3常用科学计算和数据分析包(numpy, scipy, matplotlib, sklearn, pandas)的安装,以及Jupyter No ...

  8. Python面试180道题

    版权声明:本文为CSDN博主「CSDN学院官方账号」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/csd ...

  9. MySQL必知必会(Select, Order by子句)

    SELECT prod_name FROM products ORDER BY prod_name; SELECT prod_id, prod_price, prod_name FROM produc ...

  10. 学习ThinkPHP的第23天---门面、钩子与行为

    一.门面(facade) 门面在ThinkPHP中可以理解为一个代理商,有了它可以灵活的去使用其中的类. 二.钩子和行为 钩子也可以说是插件,就是程序运行到某个位置,我们用钩子把这个程序截住,去执行所 ...