python版本的迭代器模式

# -*- coding:UTF-8 -*-
from abc import ABCMeta, abstractmethod


class Iterator(metaclass=ABCMeta):
    @abstractmethod
    def first(self):
        pass

    @abstractmethod
    def next(self):
        pass

    @abstractmethod
    def is_done(self):
        pass

    @abstractmethod
    def current_item(self):
        pass


class Aggregate(metaclass=ABCMeta):
    @abstractmethod
    def create_iterator(self):
        pass


class ConcreteIterator(Iterator):
    def __init__(self, aggregate):
        self.__aggregate = aggregate
        self.__current = 0

    def first(self):
        return self.__aggregate[0]

    def next(self):
        ret = None
        self.__current += 1
        if self.__current < self.__aggregate.count:
            ret = self.__aggregate[self.__current]
        return ret

    def is_done(self):
        return True if self.__current >= self.__aggregate.count else False

    def current_item(self):
        return self.__aggregate[self.__current]


class ConcreteAggregate(Aggregate):
    def __init__(self):
        self.__items = []

    def create_iterator(self):
        return ConcreteIterator(self)

    @property
    def count(self):
        return len(self.__items)

    def __getitem__(self, index):
        return self.__items[index]

    def __setitem__(self, index, value):
        return self.__items.insert(index, value)


if __name__=="__main__":
    a = ConcreteAggregate()
    a[0]="大鸟"
    a[1]="小菜"
    a[2]="行李"
    a[3]="老外"
    a[4]="公交车员工"
    a[5]="小偷"
    i = ConcreteIterator(a)
    item = i.first()
    while not i.is_done():
        print("{} 请买车票".format(i.current_item()))
        i.next()

 

posted @ 2018-01-25 10:57  gjw  阅读(135)  评论(0)    收藏  举报