设计目的:
提供一种方法顺序访问一个聚合对象(如数组、链表、树)中的各个元素,而又不需要暴露该对象的内部表示。
没有迭代器模式之前,如果你想遍历一个集合,你必须知道这个集合的底层结构。
如果它是数组 ,你需要用
for (int i=0; i<len; i++)。如果它是链表 ,你需要通过
node.next来遍历。如果它是树结构,你可能需要写复杂的递归深度优先或广度优先遍历。
客户端代码如果与集合的内部结构紧密耦合。如果哪天你想把底层的数组改成链表,所有遍历它的代码都得跟着改。有了迭代器就可以让你在不明确集合类型时先写好代码,消除变更顾虑。
核心结构:
迭代器接口 :声明 hasNext
()、next()等遍历方法。具体迭代器:实现遍历算法,记录当前位置。
集合接口 :声明 createIterator
()工厂方法。具体集合:返回对应的具体迭代器实例。
工作方式 :客户端通过集合接口获取迭代器,然后循环调用
hasNext()和next()访问元素,完全解除了客户端与集合内部结构的耦合。
迭代器模式是现代编程语言中的"内置公民",
foreach就是迭代器模式的语法糖:
Java :
java.util.Iterator接口,foreach语法糖会编译成while(iterator.hasNext())C# :
IEnumerator接口,foreach直接依赖它Python :迭代器协议(
__iter__、__next__),for in循环底层就是调用它JavaScript :
Symbol.iterator协议,for...of循环使用它Rust :
Iteratortrait,for循环会自动调用into_iter()Go :虽然没泛型迭代器,但
for range对 slice/map/channel 也是类似思想