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

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

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

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

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

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

众人都干了...

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

众人又干了.....

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

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

又过了一分钟...大师兄说,你们真怂.....来来来,我挨个单挑你们这群战斗力为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. 给UIWebView调整UserAgent字段

    +(void)setWebViewUserAgent:(NSString *)suffix { UIWebView *webView = [[UIWebView alloc] initWithFram ...

  2. jmeter 中的 Beanshell 使用

    一.操作变量:通过使内置对象vars可以对变量进行存取操作 a) vars.get("name"):从jmeter中获得变量值 b) vars.put("key" ...

  3. 2015.10.15class

    #include<stdio.h> main() { int a; printf("你的智商是多少?\n"); scanf("%d",&a) ...

  4. web安全之sql注入的防御

    自动把引号转义     1.防御sql注入的基本原则           任何时候不应该改变用户的输入                    比如用户输入单引号,那输出也要是单引号.   几种基本的防 ...

  5. Python实例2

    2.企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:20万到40万之间 ...

  6. thinkphp基于角色的权限控制详解

    一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通 ...

  7. jQuery的选择器中的通配符使用介绍

    $("input[id^='data']");//id属性以data开始的所有input标签 $("input[id$='data']");//id属性以dat ...

  8. easyui datebox 设置不可编辑

    easyui datebox不允许编辑可以输入 editable="false"<input class="easyui-datebox" editabl ...

  9. 三级联动(在YII框架中)

    //三级联动 //数据库代码过多就不上传了 //视图 <div class="area">    <table class="table"&g ...

  10. UVA 1151

    /* 题意:有n个点,现在需要联通所有,有q种套餐可以选择, 当然套餐之外也可以自己添加边,意为达到最短距离. 题意很明显,不知道需要使用哪一种套餐, 那么需要枚举每一种套餐的情况. 然后再进行对比. ...