迭代器模式
迭代器模式用于在不暴露集合内部结构的情况下,按顺序访问集合元素。
一句话理解:集合怎么存不用管,给我一个统一的遍历方式。
解决什么问题
不同集合内部结构不同:
- 数组按下标访问。
- 链表按节点访问。
- 树需要递归遍历。
- 数据库分页需要分批读取。
如果客户端知道每种集合的内部结构,耦合会很重。迭代器把遍历逻辑封装起来,让客户端只关心 hasNext() 和 next()。
基本结构
text
Aggregate -> createIterator()
Iterator -> hasNext(), next()Java 标准库已经内置了迭代器模式:
java
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}Java 示例
自定义迭代器:
java
interface Iterator<E> {
boolean hasNext();
E next();
}集合对象:
java
class NameCollection {
private final String[] names;
NameCollection(String[] names) {
this.names = names;
}
public Iterator<String> iterator() {
return new NameIterator();
}
private class NameIterator implements Iterator<String> {
private int index;
public boolean hasNext() {
return index < names.length;
}
public String next() {
return names[index++];
}
}
}使用:
java
NameCollection collection = new NameCollection(new String[]{"Java", "MySQL", "Linux"});
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}客户端不需要知道底层是数组、链表还是其他结构。
使用场景
- 集合遍历。
- 分页游标。
- 文件逐行读取。
- 树结构遍历。
- 数据流消费。
优点
- 遍历逻辑和集合结构分离。
- 客户端访问方式统一。
- 可以提供多种遍历方式。
- 不暴露集合内部实现。
缺点
- Java 已经内置,普通业务很少需要手写。
- 自定义迭代器要处理边界、并发修改等问题。
- 对简单集合直接使用标准迭代器即可。
实战注意
在 Java 中重点理解 Iterable、Iterator、增强 for 循环之间的关系:
java
for (String item : list) {
System.out.println(item);
}增强 for 本质上就是基于迭代器。