目录
意图
- 提供一种在不暴露其底层表示的情况下按顺序访问聚合对象的元素的方法。
- C++ 和 Java 标准库抽象,使得解耦集合类和算法成为可能。
- 将集合的遍历提升为“完整对象状态”。
- 多态遍历
问题
需要“抽象”遍历完全不同的数据结构,以便可以定义能够透明地与每个数据结构交互的算法。
讨论
“诸如列表之类的聚合对象应该为您提供一种在不暴露其内部结构的情况下访问其元素的方法。此外,您可能希望以不同的方式遍历列表,具体取决于您需要完成的任务。但您可能不会想要用不同的遍历操作使 List 接口膨胀,即使您可以预料到您需要的操作。您可能还需要在同一个列表上挂起多个遍历。而且,为遍历多种类型的聚合对象(即多态迭代)提供统一的接口可能很有价值。
迭代器模式可以让您完成所有这些工作。关键思想是从聚合对象中承担访问和遍历的责任,并将其放入定义标准遍历协议的 Iterator 对象中。
迭代器抽象是称为“通用编程”的新兴技术的基础。该策略旨在将“算法”的概念与“数据结构”的概念明确区分开来。动机是:促进基于组件的开发,提高生产力,减少配置管理。
举个例子,如果你想支持四种数据结构(数组、二叉树、链表和哈希表)和三种算法(排序、查找和合并),传统方法需要四乘三排列来开发和维护. 然而,通用编程方法只需要四加三个配置项。
结构
Client 直接使用 Collection 类的公共接口。但是对集合元素的访问被封装在称为迭代器的附加抽象级别之后。每个 Collection 派生类都知道要创建和返回哪个 Iterator 派生类。之后,Client 依赖于 Iterator 基类中定义的接口。

例子
Iterator 提供了在不暴露对象底层结构的情况下按顺序访问聚合对象元素的方法。文件是聚合对象。在通过行政或秘书人员访问文件的办公室环境中,迭代器模式被演示为秘书充当迭代器。围绕一位高管试图了解秘书的档案系统的前提,已经开发了几部电视喜剧短剧。对于行政人员来说,档案系统令人困惑且不合逻辑,但秘书能够快速有效地访问文件。
在早期的电视机上,使用拨盘来改变频道。浏览频道时,无论该频道是否有接收信号,观众都需要在每个频道位置移动转盘。在现代电视机上,使用了下一个和上一个按钮。当观众选择“下一个”按钮时,将显示下一个调谐频道。考虑在陌生城市的酒店房间里看电视。浏览频道时,频道号不重要,但节目很重要。如果一个频道上的节目不感兴趣,观众可以请求下一个频道,而不知道它的号码。

检查清单
- 向“collection”类添加一个
create_iterator()
方法,并授予“iterator”类特权访问权限。 - 设计一个“迭代器”类,可以封装“集合”类的遍历。
- 客户端要求集合对象创建一个迭代器对象。
- 客户端使用
first()
、is_done()
、next()
和current_item()
协议来访问集合类的元素。
经验法则
- Interpreter 的抽象语法树是 Composite(因此 Iterator 和 Visitor 也适用)。
- Iterator 可以遍历 Composite。访问者可以对组合应用操作。
- 多态迭代器依赖于工厂方法来实例化适当的迭代器子类。
- Memento 经常与 Iterator 结合使用。Iterator 可以使用 Memento 来捕获迭代的状态。迭代器在内部存储备忘录。
本文来自转载,原文链接: