[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)模式,它在一个很常见的过程上提供了 ...
随机推荐
- C#编程语言与面向对象—— 多态
多态编程的基本原理是: 使用基类或接口变量编程. 在多态编程中,基类一般都是抽象类,其中拥有一个或多个抽象方法,各个子类可以根据需要重写这些方法.或者使用接口,每个接口都规定了一个或多个抽象方法,实现 ...
- ios 多种传值方式
在网上看了看传值方法,没有找到完整的.在这把自己看到的几种传值方法写写吧. 1 . 属性传值 2 . 通知传值 3 . 代理传值 4 . block传值 5 . 单列传值 6 . ShareAppli ...
- 转换成的jar文件接收后台的信息乱码cmd解决办法
运行——cmd—— java -jar -Dfile.encoding=utf-8 xxx.jar
- Android Volley gives me 400 error
本文来自:http://stackoverflow.com/questions/21739276/android-volley-gives-me-400-error 本人是根据文中的其中一方法: I ...
- java内存图解
最近突然对java的内存管理来了兴趣想,之前对java内存很模糊,通过这几天的学习现在将学习成果记录下来欢迎大家多多指教,为了方便我自己画了一个图
- google搜索技巧
说明:‘’是为了突出,不属于搜索表达式的一部分 —————————————————————— 1.空格 空格代表和 例如 复旦 社会学 搜索结果网页同时包含这两个关键字. 2.‘-’ ’-‘代表排除某 ...
- 关于是用dotnet获取本机IP地址+计算机名的方法
印象中在maxscript帮助文档里找到过方法,但是当时没记下来.只能通过dotnet实现了. 如果电脑有无线网卡和本地连接,可能会出现乱码,也问了写dotnet的朋友,提供了一些思路,不过最终还是使 ...
- C++ operator 的一种不会的用法
自认为对C++比较熟悉,突然看到一些奇怪的代码(在看网上下载的代码Sockets): class SocketAddress { public: virtual ~SocketAddress() {} ...
- browser shell
我一直坚信,做项目需要通过文档来总结.一来可以梳理自己的项目和思路,二来可以备忘,三则可以为有同样需求的朋友提供一些参考.如果一直不进行总结,真的很可能是写了多年的代码,却只有一年的经验.当学习一项新 ...
- Unity 相关经典博客资源总结(持续更新)
就作为一个记录吧,把平时看过的Unity相关的一些好的Blog记录并分享. 好的论坛: Unity官方脚本 点评:这个不用说了,最核心的内容,理解整个Unity引擎的方方面面,梳理结构. Unity ...