在 Iterator 设计模式的“结构”部分中,书Design Patterns: Elements of Reusable Object-Oriented Software定义了Iterator
类,它具有四个基本操作:First
,{{ 1}},Next
和IsDone
。
在“实施”部分中,该书包含following item:
谁定义遍历算法?迭代器不是唯一可以定义遍历算法的地方。汇总 可能会定义遍历算法并使用迭代器进行存储 只是迭代的状态。我们称这种迭代器为 光标,因为它仅指向聚合中的当前位置。客户端将在集合上调用
CurrentItem
操作 以光标为参数,Next
操作将发生变化 光标的状态。如果迭代器负责遍历算法,则它是 易于在同一聚合上使用不同的迭代算法,并且 在不同的地方重用相同的算法也可能更容易 聚集体。另一方面,遍历算法可能需要 访问聚合的私有变量。如果是这样,将 迭代器中的遍历算法违反了 聚集。
但是没有提供游标迭代器的示例实现。
谁应该公开用于控制迭代,游标迭代器或集合的界面?
这是我将如何在Python中实现这两种选择。
如果 cursor迭代器公开了迭代接口,除了Next
和GetState
操作之外,它还应定义SetState
,{ {1}},First
和Next
基本操作并委托给相应的聚合操作:
IsDone
并且集合应该定义相同的基本操作,这些基本操作使用其CurrentItem
和class Iterator:
def __init__(self, aggregate):
self.__aggregate = aggregate
def first(self):
self.__aggregate._first(self)
def next(self):
self.__aggregate._next(self)
def is_done(self):
return self.__aggregate._is_done(self)
def current_item(self):
return self.__aggregate._current_item(self)
def _get_state(self):
return self.__state
def _set_state(self, state):
self.__state = state
操作来检索和更新游标迭代器状态:
GetState
然后,客户端将使用游标迭代器来控制迭代:
SetState
如果 aggregate 公开了迭代接口,则游标迭代器应定义class Aggregate:
def __init__(self, list):
self.__list = list
def _first(self, iterator):
iterator._set_state(0)
def _next(self, iterator):
iterator._set_state(iterator._get_state() + 1)
def _is_done(self, iterator):
return iterator._get_state() >= len(self.__list)
def _current_item(self, iterator):
if self._is_done(iterator):
raise ValueError
return self.__list[iterator._get_state()]
def create_iterator(self):
return Iterator(self)
和aggregate = Aggregate(["foo", "bar", "baz", "qux"])
iterator = aggregate.create_iterator()
iterator.first()
while not iterator.is_done():
print(iterator.current_item())
iterator.next()
操作:
GetState
并且集合应该定义SetState
,class Iterator:
def _get_state(self):
return self.__state
def _set_state(self, state):
self.__state = state
,First
和Next
基本操作,这些基本操作使用其IsDone
和CurrentItem
个操作:
GetState
然后,客户端将使用聚合来控制迭代:
SetState