[python实现设计模式]-5.迭代器模式-一起撸串嗨皮啦
迭代器模式是一个我们经常使用但是出境不高的模式。
为啥捏?因为大部分的语言都帮我们实现了细节,我们不许关注他的实现就能用的很嗨皮了。
不管怎样。这也是个非常常用的模式.
俗话说得好,这个世界上没有事情是一顿撸串解决不了的,如果有,那就是两顿撸串。
那么,我们今天的故事就从撸串说起。
众人在撸串中.大师兄一拍桌子.来来来...大家一起走一个...干!!!了....
众人都干了...
一分钟后...大师兄一拍桌子.来来来...大家一起走一个...干!!!了....
众人又干了.....
一分钟后...大师兄一拍桌子.来来来...大家一起走一个...干!!!了....
众人纷纷尿了.....表示,太高能了...搞不下去了.....
又过了一分钟...大师兄说,你们真怂.....来来来,我挨个单挑你们这群战斗力为0的渣渣......
于是...大师兄按照顺时针方向挨个单挑....
first , 旭明, next 帅哥, next 志xin, next.....
谁也跑不了...
那么,这就是个迭代器模式.
---------------------------------------
概述:
迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示。
实用场合:
1.访问一个聚合对象的内容而无需暴露它的内部表示。
2.支持对聚合对象的多种遍历。
3.为遍历不同的聚合结构提供一个统一的接口(即,多态迭代)。
---------------------------------------
以上,是我抄得..
按照惯例,上例图.

so, 我们用python来实现这个过程.
# -*- coding: utf-8 -*- from abc import ABCMeta, abstractmethod #迭代器抽象类
class Iterator(object): __metaclass__ = ABCMeta def __init__(self):
pass @abstractmethod
def Frist(self):
pass @abstractmethod
def Next(self):
pass @abstractmethod
def Isdone(self):
pass @abstractmethod
def CurrentItem(self):
pass #聚集抽象类
class Aggregate(object):
__metaclass__ = ABCMeta def __init__(self):
pass @abstractmethod
def CreateIterator(self):
pass #迭代器具体实现类
class ConcreteIterator(Iterator): def __init__(self, concreteAggregate):
self.__concreteAggregate = concreteAggregate
self.__current = 0 def Isdone(self):
return True if self.__current >= self.__concreteAggregate.Count else False def Next(self):
self.__current += 1
if self.__current < self.__concreteAggregate.Count:
return self.__concreteAggregate.GetItem(self.__current) def CurrentItem(self):
return self.__concreteAggregate.GetItem(self.__current) def Frist(self):
return self.__concreteAggregate.GetItem(0) #实现聚集类
class ConcreteAggregate(Aggregate): Items = None #实现抽象方法
def CreateIterator(self):
return ConcreteAggregate() def __init__(self):
ConcreteAggregate.Items = [] @property
def Count(self):
return ConcreteAggregate.Items.__len__() def GetItem(self, index):
return ConcreteAggregate.Items[index] if __name__ == "__main__": concreteAggregate = ConcreteAggregate()
concreteAggregate.Items.append('xuming')
concreteAggregate.Items.append('帅哥')
concreteAggregate.Items.append('zhixin')
concreteAggregate.Items.append('高峰')
concreteAggregate.Items.append('创始人')
concreteAggregate.Items.append('小灰灰') print "大师兄开始单挑了!!!....\n" iterator = ConcreteIterator(concreteAggregate) obj = iterator.Frist()
while not iterator.Isdone():
print "\n撸撸撸... 该你啦!", iterator.CurrentItem()
print "这里假装在喝酒"
print iterator.CurrentItem(), "假装喝完了"
print "大师兄休息几秒钟...\n", "*" * 10
iterator.Next()
运行结果:

最后再说两句:
这是一个非常常用的模式,但是它太常用了,所以很多语言都内置了该模式,
这反而让我们觉得这是个冷门的模式了.
比如.net framework 已经准备好了迭代器接口,只需要实现接口就行了
IEumerator 支持对非泛型集合的简单迭代
上面的例子用一个foreach就可以实现
其实吧, foreach 关键字就是一个语法糖, 背后实现的原理就是迭代器模式.
另外我们可以使用yield 关键字来简化迭代.
详见:
https://msdn.microsoft.com/zh-cn/library/65zzykke(v=vs.100).aspx
以上,就是迭代器模式。
希望对你有所帮助.
to be continued.
[python实现设计模式]-5.迭代器模式-一起撸串嗨皮啦的更多相关文章
- Python进阶:设计模式之迭代器模式
在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础 ...
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
- js设计模式——4.迭代器模式
js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...
- 实践GoF的设计模式:迭代器模式
摘要:迭代器模式主要用在访问对象集合的场景,能够向客户端隐藏集合的实现细节. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:迭代器模式>,作者:元闰子. 简介 有时会遇到这 ...
- python 设计模式之迭代器模式
#写在前面 真的有一大把年纪了,回头看看, 明明也很努力,却发现自己穷的一无所有,昨夜的事更是让我眼泪止不住的流,眼睛也肿了,委屈的愣是说不出一个字.前面荆棘丛生,身后已无退路,生活一地鸡毛,糟糕的一 ...
- 【GOF23设计模式】迭代器模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 package com.test.iterator; /** * 自定义的迭代 ...
- [设计模式] 16 迭代器模式 Iterator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...
- php设计模式之迭代器模式
今天的PHP设计模式系列的主角是迭代器(Iterator)模式,迭代器模式提供了抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代. 迭代器(Iterator)模式,它在一个很常见的过程上提供了 ...
随机推荐
- iOS 统计App 的代码总行数
打开Terminal,cd 到项目的根目录下,输入以下命令 find . -name "*.m" -or -name "*.mm" -or -name &quo ...
- Codeforces Round #379 (Div. 2) A B C D 水 二分 模拟
A. Anton and Danik time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- jmeter 中的 Beanshell 使用
一.操作变量:通过使内置对象vars可以对变量进行存取操作 a) vars.get("name"):从jmeter中获得变量值 b) vars.put("key" ...
- (转) 变分自编码器(Variational Autoencoder, VAE)通俗教程
变分自编码器(Variational Autoencoder, VAE)通俗教程 转载自: http://www.dengfanxin.cn/?p=334&sukey=72885186ae5c ...
- dhtmlxScheduler日程安排控件
dhtmlxScheduler是一个JavaScript日程安排控件 官方网站:http://www.dhtmlx.com/在线帮助文档:http://docs.dhtmlx.com/doku.php ...
- 远程调试js注意事项
1:使用host切换工具,先注释掉93服务器的地址,打开链接,点击高级选项,进去后登陆账号密码(如果不行重启浏览器): 2:进入后,增加93服务器上的host地址,重启浏览器,css样式生效: 3:使 ...
- c# equals与==
对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true.对于 string ...
- Bash之PS1配置
今天想调整以下PS1的显示,查看了很多文档后有些收获.Bash有可自定义的4类提示: PS1 在每个命令之前显示的主提示符,因此它是每个人都不同的. PS2 当一个命令需要更多的输入(例如,一个多行命 ...
- 针对web高并发量的处理
针对web高并发量的处理 针对高并发量的处理 一个老生常谈的话题了 至于需要运维支持的那些cdn.负载均衡神马的就不赘述了 你们都懂的 虫子在此博文只讲一些从程序角度出发的一些不错的解决方案. 至于从 ...
- Selenium2入门(一)简介
Selenium 是一款有名的 Web 应用程序测试框架,用于进行功能测试.新版本 Selenium 2 结合了 Selenium 1 和 WebDriver(Selenium 的并行项目)中的最佳特 ...