# -*- 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()