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

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

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

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

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

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

众人都干了...

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

众人又干了.....

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

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

又过了一分钟...大师兄说,你们真怂.....来来来,我挨个单挑你们这群战斗力为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. C#编程语言与面向对象—— 多态

    多态编程的基本原理是: 使用基类或接口变量编程. 在多态编程中,基类一般都是抽象类,其中拥有一个或多个抽象方法,各个子类可以根据需要重写这些方法.或者使用接口,每个接口都规定了一个或多个抽象方法,实现 ...

  2. ios 多种传值方式

    在网上看了看传值方法,没有找到完整的.在这把自己看到的几种传值方法写写吧. 1 . 属性传值 2 . 通知传值 3 . 代理传值 4 . block传值 5 . 单列传值 6 . ShareAppli ...

  3. 转换成的jar文件接收后台的信息乱码cmd解决办法

    运行——cmd——    java -jar -Dfile.encoding=utf-8 xxx.jar

  4. Android Volley gives me 400 error

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

  5. java内存图解

      最近突然对java的内存管理来了兴趣想,之前对java内存很模糊,通过这几天的学习现在将学习成果记录下来欢迎大家多多指教,为了方便我自己画了一个图

  6. google搜索技巧

    说明:‘’是为了突出,不属于搜索表达式的一部分 —————————————————————— 1.空格 空格代表和 例如 复旦 社会学 搜索结果网页同时包含这两个关键字. 2.‘-’ ’-‘代表排除某 ...

  7. 关于是用dotnet获取本机IP地址+计算机名的方法

    印象中在maxscript帮助文档里找到过方法,但是当时没记下来.只能通过dotnet实现了. 如果电脑有无线网卡和本地连接,可能会出现乱码,也问了写dotnet的朋友,提供了一些思路,不过最终还是使 ...

  8. C++ operator 的一种不会的用法

    自认为对C++比较熟悉,突然看到一些奇怪的代码(在看网上下载的代码Sockets): class SocketAddress { public: virtual ~SocketAddress() {} ...

  9. browser shell

    我一直坚信,做项目需要通过文档来总结.一来可以梳理自己的项目和思路,二来可以备忘,三则可以为有同样需求的朋友提供一些参考.如果一直不进行总结,真的很可能是写了多年的代码,却只有一年的经验.当学习一项新 ...

  10. Unity 相关经典博客资源总结(持续更新)

    就作为一个记录吧,把平时看过的Unity相关的一些好的Blog记录并分享. 好的论坛: Unity官方脚本  点评:这个不用说了,最核心的内容,理解整个Unity引擎的方方面面,梳理结构. Unity ...