导言
在面向对象的软件设计中,如果一个系统有比较复杂的数据结构,客户程序往往没有必要详细地知道其内部的实现。为了使用方便,该系统应该提供给客户程序一种遍历方法。该遍历方法类似于使用电视机遥控器来浏览电视频道,客户程序只要按照顺序调用 next()方法即可得到相应的数据。本节介绍如何给复杂的聚合型数据结构提供一个遍历方法的设计模式——迭代器模式(Iterator Pattern)。
迭代器模式的关键思想是将对列表的访问和便利从列表对象中分离出来,放入一个独立的迭代器对象中。迭代器类定义了访问该列表元素的接口。迭代器类提供的方法负责跟踪当前的元素,即它知道哪些元素已经遍历过了,哪些元素还没有被遍历。
迭代器模式能够提供一种方法按照顺序访问一个聚合对象中的所有元素,而又不需要暴露该对象的内部表示。
迭代器模式的结构图如图所示。
迭代器模式的各组成部分及含义说明如下。
值得注意的是,再迭代器模式类图的聚合部分,可以包含有几种不同的具体的聚合类(ConcreteAggregate)。这样,在迭代器部分,针对每个具体的聚合类,可以允许有一个或者多个具体的迭代器类。这些具体的迭代器类都实现同一个接口 Iterator。其好处可以为类似(但是不同)的聚合类设计/实现出类似(但是不同)的迭代器,便于复用。
协作关系指 ConcreteIterator 跟踪聚合类中的当前对象,并能够计算出待遍历的后继对象。
在创建列表迭代器的遍历对象之前,必须提供待遍历的列表,一旦有了该列表迭代器对象,就可以按照顺序访问该列表的各个元素。currentItem()操作返回列表中的当前元素,first()操作初始化迭代器,使当前元素指向列表的第一个元素。next()操作将当前元素指针向前推进一步,指向下一个元素。isDone()操作检查是否已经越过最后一个元素,也就是完成了这次遍历。
迭代器模式的优点如下。
from abc import ABC, abstractmethod
class Aggregate(ABC):
@abstractmethod
def create_iterator(self):
pass
class ConcreteAggregate(Aggregate):
def __init__(self):
self.data_structure = list(range(10))
def create_iterator(self):
return ConcreteIterator(self)
class Iterator(ABC):
@abstractmethod
def first(self):
pass
@abstractmethod
def next(self):
pass
@abstractmethod
def is_done(self):
pass
@abstractmethod
def current_item(self):
pass
class ConcreteIterator(Iterator):
def __init__(self, aggregate):
self.aggregate = aggregate
self.first()
def first(self):
# noinspection PyAttributeOutsideInit
self.index = 0
def next(self):
self.index += 1
def is_done(self):
if self.index == len(self.aggregate.data_structure):
return True
return False
def current_item(self):
return self.aggregate.data_structure[self.index]
class Client:
@staticmethod
def main():
aggregate = ConcreteAggregate()
iterator = aggregate.create_iterator()
while not iterator.is_done():
print(iterator.current_item())
iterator.next()
if __name__ == '__main__':
Client.main()
本文分享自 Python机器学习算法说书人 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!