迭代器模式是一个咱们常常使用可是出境不高的模式。python
为啥捏?由于大部分的语言都帮咱们实现了细节,咱们不准关注他的实现就能用的很嗨皮了。app
无论怎样。这也是个很是经常使用的模式.spa
俗话说得好,这个世界上没有事情是一顿撸串解决不了的,若是有,那就是两顿撸串。.net
那么,咱们今天的故事就从撸串提及。code
众人在撸串中.大师兄一拍桌子.来来来...你们一块儿走一个...干!!!了....对象
众人都干了...blog
一分钟后...大师兄一拍桌子.来来来...你们一块儿走一个...干!!!了....接口
众人又干了.....utf-8
一分钟后...大师兄一拍桌子.来来来...你们一块儿走一个...干!!!了....it
众人纷纷尿了.....表示,过高能了...搞不下去了.....
又过了一分钟...大师兄说,大家真怂.....来来来,我挨个单挑大家这群战斗力为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.