[python實現設計模式]-5.迭代器模式-一塊兒擼串嗨皮啦

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

相關文章
相關標籤/搜索