关于 gof-iterator
gof-iterator 介绍迭代器设计模式,通过让集合提供独立迭代器,按顺序访问元素而不暴露内部表示。适合设计自定义集合或统一遍历不同数据结构的开发者。
主要功能
- 01分离集合与遍历职责
- 02按顺序逐项访问元素
- 03多个迭代器独立维护位置
- 04遵循语言标准迭代接口
适用场景
- 01统一遍历数组、哈希表和链表
- 02为树或图等自定义集合提供遍历
- 03避免调用方依赖集合内部类型
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ yonatankarp/ software-design-skills --skill gof-iterator安装后在 Claude Code 中输入/gof-iterator确认已加载。
详细介绍
一句话概述
提供一种按顺序访问聚合对象元素的方式,同时不暴露其底层表示。
何时使用此技能
- 需要以统一方式遍历多种聚合类型,但它们使用不同的内部结构(一种使用数组,另一种使用哈希映射,第三种使用链表)。
- 某个方法需要使用集合,但不应依赖于具体的集合类型。
- 实现需要在客户端代码中可遍历的自定义集合(树、图、分页远程数据集)。
何时不要使用此技能
- 语言已经支持遍历标准集合(所有现代语言都是如此),而且你并未设计自定义集合——直接使用语言的
for-each/ 迭代功能即可。 - 所谓的“迭代”实际上是转换或筛选流水线——这是更高层级的概念,应使用语言的流 / 序列。
- 你需要的是随机访问,而不是顺序访问——Iterator 按定义就是顺序访问。
核心内容
该模式将两项职责分开:
- Aggregate 拥有数据,并了解其内部结构。
- Iterator 知道如何逐个遍历该结构中的元素。
聚合对象提供一个方法(通常为 iterator()),返回一个新的 Iterator。Iterator 实现标准接口(hasNext()、next(),有时还有 remove())。
同一个聚合对象上可以同时存在多个迭代器,各自跟踪自己的位置——因此,迭代状态应归属于 Iterator,而非聚合对象。
这种模式十分基础,几乎所有现代语言都已将其内置于语言和标准库中。Kotlin、Java、C#、Python、Swift、Rust、JavaScript 都有 Iterator 或 Iterable 接口,以及用于遍历它们的 for 循环。
决策启发
- 对于内置集合,绝不要自行实现 Iterator——语言已经提供了。
- 设计自定义集合或流时,实现语言的标准 Iterator 接口,这样客户端代码就能使用惯用的迭代方式(Kotlin 对
Iterable使用for,Java 使用for-each,Python 使用for x in y)。 - 对于一次性遍历中的筛选或转换,优先使用流 / 序列,而非有状态迭代器。
反模式
- 暴露底层集合(
getInternalList()),让调用者直接遍历——这会破坏封装;调用者会依赖具体类型。 - 在遍历过程中以聚合对象未授权的方式修改它的迭代器——这通常会导致并发修改错误。
- 自定义迭代器不符合语言的标准接口——会迫使客户端代码采用专门的模式。
另请参阅
gof-composite— Iterator 是遍历 Composite 结构的自然方式。gof-kotlin-idioms—Sequence、Iterable、Iterator<T>接口和iterator { yield(x) }构建器都是一等功能;自行编写迭代器类很少是正确选择。
参考资料
- Head First Design Patterns(第 2 版),第 9 章(“管理完善的集合:Iterator 和 Composite 模式”)——本模式的经典章节,以两家餐厅合并存储在不同数据结构中的菜单为背景。
评论
支持 Markdown