如何实现游标迭代器?

时间:2019-11-09 16:00:46

标签: design-patterns iterator cursor

Iterator 设计模式的“结构”部分中,书Design Patterns: Elements of Reusable Object-Oriented Software定义了Iterator类,它具有四个基本操作:First,{{ 1}},NextIsDone

在“实施”部分中,该书包含following item

  
      
  1. 谁定义遍历算法?迭代器不是唯一可以定义遍历算法的地方。汇总   可能会定义遍历算法并使用迭代器进行存储   只是迭代的状态。我们称这种迭代器为   光标,因为它仅指向聚合中的当前位置。客户端将在集合上调用CurrentItem操作   以光标为参数,Next操作将发生变化   光标的状态。

         

    如果迭代器负责遍历算法,则它是   易于在同一聚合上使用不同的迭代算法,并且   在不同的地方重用相同的算法也可能更容易   聚集体。另一方面,遍历算法可能需要   访问聚合的私有变量。如果是这样,将   迭代器中的遍历算法违反了   聚集。

  2.   

但是没有提供游标迭代器的示例实现。

谁应该公开用于控制迭代,游标迭代器或集合的界面?

这是我将如何在Python中实现这两种选择。

  • 如果 cursor迭代器公开了迭代接口,除了NextGetState操作之外,它还应定义SetState,{ {1}},FirstNext基本操作并委托给相应的聚合操作:

    IsDone

    并且集合应该定义相同的基本操作,这些基本操作使用其CurrentItemclass 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

    并且集合应该定义SetStateclass Iterator: def _get_state(self): return self.__state def _set_state(self, state): self.__state = state FirstNext基本操作,这些基本操作使用其IsDoneCurrentItem个操作:

    GetState

    然后,客户端将使用聚合来控制迭代:

    SetState

0 个答案:

没有答案