My App

迭代器模式

Iterator — 提供统一的方式遍历集合,不暴露内部结构

一句话理解

让你可以用统一的方式遍历不同的集合(数组、链表、树……),而不需要知道集合的内部结构。

解决什么问题

  • 不同的数据结构有不同的遍历方式,调用方需要了解内部实现才能遍历
  • 想对外提供统一的遍历接口,隐藏内部复杂性

怎么写

// 迭代器接口
public interface Iterator<T> {
    boolean hasNext();
    T next();
}

// 自定义集合
public class NumberList {
    private final int[] data;

    public NumberList(int... data) { this.data = data; }

    // 返回迭代器
    public Iterator<Integer> iterator() {
        return new Iterator<>() {
            private int index = 0;

            public boolean hasNext() { return index < data.length; }
            public Integer next() { return data[index++]; }
        };
    }
}
NumberList list = new NumberList(1, 2, 3, 4, 5);
Iterator<Integer> it = list.iterator();

while (it.hasNext()) {
    System.out.println(it.next());
}

现实中的迭代器

Java 和 JavaScript 都内置了迭代器,日常开发中其实一直在用:

// Java 的 for-each 底层就是迭代器
List<String> names = List.of("张三", "李四", "王五");
for (String name : names) {
    System.out.println(name);  // 编译器自动调用 iterator()
}
// JavaScript 的 for...of 基于 Symbol.iterator
const arr = [1, 2, 3]
for (const item of arr) {
  console.log(item)
}

// 自定义可迭代对象
const range = {
  from: 1,
  to: 5,
  [Symbol.iterator]() {
    let current = this.from
    return {
      next: () => current <= this.to
        ? { value: current++, done: false }
        : { done: true }
    }
  }
}

for (const n of range) console.log(n)  // 1 2 3 4 5

使用场景

  • Java 的 Iterable / Iterator 接口
  • JavaScript 的 Symbol.iterator / for...of
  • Python 的 __iter__ / __next__
  • 数据库游标(Cursor)
  • 分页查询结果的遍历

On this page