迭代器模式将遍历逻辑从集合中分离,由独立迭代器对象负责,客户端统一用hasNext()和next()遍历不同结构;含抽象迭代器、具体迭代器、抽象聚合、具体聚合四角色,消除类型判断与重复循环。

迭代器模式通过把“怎么遍历”从集合本身抽出来,交给独立的迭代器对象负责,让客户端用同一套方法(比如 hasNext() 和 next())去遍历数组、链表、树甚至自定义容器,完全不用管底层是啥结构。
明确四个核心角色分工
要真正用起来,得先搭好骨架:
-
抽象迭代器(Iterator):只定义两个基础方法——
hasNext()判断是否还有元素,next()返回当前并移到下一个;不涉及任何具体数据结构 - 具体迭代器(ConcreteIterator):实现上面的接口,内部持有对具体集合的引用,并维护自己的游标位置(比如数组下标、链表指针)
-
抽象聚合(Aggregate):声明一个
createIterator()方法,告诉外界“我能提供遍历能力” -
具体聚合(ConcreteAggregate):比如
BookList或TreeNode,它实现createIterator(),返回自己对应的具体迭代器实例
用标准接口写遍历逻辑,不写 if-else 判类型
客户端代码从此告别类型判断和重复循环:
- 以前要这样写:
if (list instanceof ArrayList) { for (int i = 0; i ,再加一套 <code>for (Object o : set),再加一套递归遍历树…… - 现在统一写:
Iterator iter = collection.createIterator(); while (iter.hasNext()) { Object item = iter.next(); /* 处理 item */ } - 哪怕后面新增了图结构或分页 API 封装类,只要它实现了
Aggregate并返回合规迭代器,这段遍历代码一毛不动
支持多种遍历策略,不改集合类本身
同一个集合可以配多个迭代器,满足不同场景:
- 正向遍历用
ForwardIterator,逆序就另写个ReverseIterator,都实现同一个Iterator接口 - 树结构可提供
InOrderIterator、LevelOrderIterator,调用方按需选择,集合类本身不用动一行 - 甚至能做惰性迭代器——比如遍历大文件时,
next()才读一行,不提前加载全部内容
语言级支持让落地更自然
主流语言已内置协议,不用从零造轮子:
- Java 中直接用
Collection.iterator(),所有List、Set都天然支持,for-each循环背后就是它 - JavaScript 遵循
[Symbol.iterator]协议,自定义类加上这个方法就能用for...of或展开运算符 - Python 的
__iter__()和__next__()同理,iter(obj)和next()就是标准入口


















