迭代器模式是一个我们经常使用但是出境不高的模式。

为啥捏?因为大部分的语言都帮我们实现了细节,我们不许关注他的实现就能用的很嗨皮了。

不管怎样。这也是个非常常用的模式.

俗话说得好,这个世界上没有事情是一顿撸串解决不了的,如果有,那就是两顿撸串。

那么,我们今天的故事就从撸串说起。

众人在撸串中.大师兄一拍桌子.来来来...大家一起走一个...干!!!了....

众人都干了...

一分钟后...大师兄一拍桌子.来来来...大家一起走一个...干!!!了....

众人又干了.....

一分钟后...大师兄一拍桌子.来来来...大家一起走一个...干!!!了....

众人纷纷尿了.....表示,太高能了...搞不下去了.....

又过了一分钟...大师兄说,你们真怂.....来来来,我挨个单挑你们这群战斗力为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.迭代器模式-一起撸串嗨皮啦的更多相关文章

  1. Python进阶:设计模式之迭代器模式

    在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础 ...

  2. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  3. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

    设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...

  4. js设计模式——4.迭代器模式

    js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...

  5. 实践GoF的设计模式:迭代器模式

    摘要:迭代器模式主要用在访问对象集合的场景,能够向客户端隐藏集合的实现细节. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:迭代器模式>,作者:元闰子. 简介 有时会遇到这 ...

  6. python 设计模式之迭代器模式

    #写在前面 真的有一大把年纪了,回头看看, 明明也很努力,却发现自己穷的一无所有,昨夜的事更是让我眼泪止不住的流,眼睛也肿了,委屈的愣是说不出一个字.前面荆棘丛生,身后已无退路,生活一地鸡毛,糟糕的一 ...

  7. 【GOF23设计模式】迭代器模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 package com.test.iterator; /** * 自定义的迭代 ...

  8. [设计模式] 16 迭代器模式 Iterator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...

  9. php设计模式之迭代器模式

    今天的PHP设计模式系列的主角是迭代器(Iterator)模式,迭代器模式提供了抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代. 迭代器(Iterator)模式,它在一个很常见的过程上提供了 ...

随机推荐

  1. 关于for、foreach、filter等的一些用法

    通常我们使用得最熟悉的是for循环. 比如对于一组数字的排大小,可以使用冒泡法. var a=[];     for(var d=0;d<5;d++){         var b=window ...

  2. Android Volley gives me 400 error

    本文来自:http://stackoverflow.com/questions/21739276/android-volley-gives-me-400-error 本人是根据文中的其中一方法: I ...

  3. chrome浏览器定位页面元素对应代码查找资源

    F12 左边箭头或ctrl shift c 点击相应元素即可定位代码 应用:定位flash游戏代码后,鼠标移至带下划线链接处右键copy link

  4. JS的字符串处理

    1.字符串包含判断 var a = "qwer"; var b = "q"; if (a.contains(b)) { alert("1") ...

  5. UVA 572 (dfs)

    题意:找出一块地有多少油田.'@'表示油田.找到一块就全部标记. #include<cstdio> #define maxn 110 char s[maxn][maxn]; int n,m ...

  6. Chapter 2: Design the user experience

    Apply the user interface design for a web application 介绍了Css的常用属性和html5的新element,以及Htmlhelper的简单方法,如 ...

  7. Python3 之 import 和 当前目录

    环境: Python-3.4.3 Web.py-0.37 安装 web.py 的时候,提示 ImportError: No module named 'utils' 看看源码,setup.py,有这么 ...

  8. jsonP跨域调用

    -------------------------------------jsonP跨域调用------------------------------------- <div class=&q ...

  9. 使用jQuery Autocomplete(自动完成)插件

    jQuery 的Autocomplete(自动完成.自动填充)插件有不少,但比较下来我感觉,还是bassistance.de 的比较强大,我们就来写一些代码感受一下. 最简单的Autocomplete ...

  10. Window memcache 使用

    一.memcache配置 1. 下载memcache 32位系统 1.2.5版本:http://static.runoob.com/download/memcached-1.2.5-win32-bin ...