mcpField
G
gof-iterator

gof-iterator

github.com/yonatankarp开发143 次安装23 周前更新
代码仓库

关于 gof-iterator

gof-iterator 介绍迭代器设计模式,通过让集合提供独立迭代器,按顺序访问元素而不暴露内部表示。适合设计自定义集合或统一遍历不同数据结构的开发者。

主要功能

  1. 01分离集合与遍历职责
  2. 02按顺序逐项访问元素
  3. 03多个迭代器独立维护位置
  4. 04遵循语言标准迭代接口

适用场景

  1. 01统一遍历数组、哈希表和链表
  2. 02为树或图等自定义集合提供遍历
  3. 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