迭代器模式
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)
- 分页查询结果的遍历