大话设计模式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()
上面类的设计如下图:
当需要对聚集有多种方式遍历时,可以考虑使用迭代器模式
迭代器模式分离了集合的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合内部结构,又可以让外部代码透明的访问集合内部的数据
作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
大话设计模式Python实现-迭代器模式的更多相关文章
- 大话设计模式Python实现-解释器模式
解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 下面是一个解释器模式的demo: #!/usr/ ...
- 大话设计模式Python实现-命令模式
命令模式(Command Pattern):将请求封装成对象,从而使可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 下面是一个命令模式的demo: #!/usr/bi ...
- 大话设计模式Python实现-桥接模式
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化. 下面是一个桥接模式的demo: #!/usr/bin/env python # -*- coding: ...
- 大话设计模式Python实现-组合模式
组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 下面是一个组合模式的demo: #!/us ...
- 大话设计模式Python实现-备忘录模式
备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样已经后就可将该对象恢复到原先保存的状态 下面是一个备忘录模式的demo: #! ...
- 大话设计模式Python实现-状态模式
状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 下面是一个状态模式的demo: #!/usr/bin/env python # -*- ...
- 大话设计模式Python实现-建造者模式
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 下面是一个建造者模式的demo #!/usr/bin/env python # ...
- 大话设计模式Python实现-外观模式
外观模式(Facade Pattern):为子系统中的一组接口提供一个一致界面,此模式定义一个高层接口,使得子系统更加容易使用 下面是一个外观模式的demo: #!/usr/bin/env pytho ...
- 大话设计模式Python实现-模板方法模式
模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 下面是一个模 ...
随机推荐
- jenkins System error
背景 在使用WAR包安装jenkins后,启动tomcat,显示启动成功,但最后提示信息如下: 04-Dec-2018 03:28:21.563 WARNING [Computer.threadPoo ...
- Android 寻找Drawable资源的流程
寻找设备对应Drawable资源时,会先在设备对象dpi的drawable文件夹下寻找,如果没找到,会上溯到更高一级dpi文件夹下寻找,上溯最高两级.如果还是没有找到,会寻找noDensity文件夹下 ...
- shell脚本编程基础--文本比较
1.概述 允许测试Linux文件系统上文件的目录和状态. 2.详解 2.1 检查目录 -d测试会检查指定的目录是否存在于系统中.当我们打算将文件写入目录或是准备切换到该目录时,先进行测试是比较好的做法 ...
- dicom 影像通信(scu、scp)的c-echo、c-store、c-find、c-move
本文主要描述,dicom通信的scu,scp的c-echo.c-store.c-find.c-move的使用. DicomServiceIDicomServiceProviderIDicomCStor ...
- CentOS下永久修改主机名
永久修改主机名 [root@centos7 ~]# vim /etc/hostname 打开之后将原来的名字改成你想换的名字 [root@centos7 ~]# cat /etc/hostname 查 ...
- 第七章终结篇——8251A的总结
总算把这个第七章复习完了,我把剩下一点关于8251A的发上来吧 本来在讲解8251A书本上还有关于RS232和串口通信的讲解,但是太浅了,就不放了,有兴趣的朋友可以自行参考其他文章 串行通信芯片825 ...
- 入门级实操教程!从概念到部署,全方位了解K8S Ingress!
Kubernetes Ingress用于添加规则,以将流量从外部路由到Kubernetes集群的服务中.在本文中你将了解ingress 的概念,以及用于路由外部流量到Kubernetes deploy ...
- linux gre隧道创建
目录 linux gre隧道创建 实验环境 实验目的 实验步骤 1.在host A(10.10.10.47)上面操作 2.在host B(192.168.0.118)上面操作 实验结果 还原实验环境 ...
- 洛谷 题解 P2645 【斯诺克】
吐槽一下这道题: 数据太水了!!! 请注意,这题如果你考虑了犯规的情况,那么你的分数...可能会和我一样,只有40分. 也就是说,这是一篇AC不了这道题的题解!!! 现在,我来讲一下这道题的正解: 两 ...
- linux-history、find、
1.history:查看历史记录 -c:清除历史命令记录 -d:删除某一条使用过的命令,-d后跟命令的序列号 2.find:在目录结构中搜索文件 -type:后面跟文件的类型,d表示目录,f表示文件 ...