Iterator模式的核心是将遍历逻辑与数据存储解耦:集合只负责存储,迭代器专责遍历,通过统一接口(hasNext/next)屏蔽底层差异,并以游标维护状态,支持多迭代器并发及灵活扩展。

理解 Iterator 设计模式的原理,关键在于抓住一个核心动作:把“怎么遍历”从“存的是什么”里彻底剥离开。
遍历逻辑和数据存储各管各的事
集合类(比如 ArrayList、LinkedList、TreeSet)只负责一件事:把数据存好、管好。它不关心别人怎么读它——正着读、倒着读、跳着读,都不归它管。而迭代器(Iterator)专门负责读:知道当前走到哪、下一个在哪、还有没有下一个。两者通过接口约定协作,彼此不依赖具体实现。
就像快递柜和取件人:柜子只管锁好包裹,不决定谁来取、什么时候取、一次取几个;取件人只管按规则操作柜门,不用知道柜子内部怎么布线、怎么供电。
统一接口屏蔽底层差异
ArrayList 是数组实现,HashSet 是哈希表,LinkedList 是链表——结构天差地别,但只要你拿到它们的 iterator() 返回对象,就能用完全一样的方式遍历:
- hasNext():问“还有下一位吗?”
- next():拿走当前这位,自动挪到下一位
客户端代码写一遍,就能跑在所有实现了 Iterator 接口的集合上。不需要为每种集合写一套 for 循环逻辑。
游标机制维持遍历状态
迭代器内部通常持有一个“位置指针”(也叫游标),比如 int index 或 Node current。每次调用 next(),它就移动一次,并返回对应元素。这个状态完全由迭代器自己保管,集合本身不保存任何遍历进度。所以同一个集合可以同时被多个迭代器独立遍历,互不干扰。
解耦带来灵活扩展空间
因为遍历行为被抽成独立对象,你可以轻松添加新能力:
- 写一个 ReverseIterator,实现倒序遍历
- 写一个 FilterIterator,在 next() 时自动跳过不符合条件的元素
- 写一个 SafeIterator,支持遍历时安全删除(避免 ConcurrentModificationException)
这些新迭代器只需换实现,不用动原有集合代码,也不影响老客户端。


















