[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.

相关文章
相关标签/搜索