迭代器模式是一個咱們常常使用可是出境不高的模式。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.