迭代器模式(Iterator Pattern)

Java和.Net编程环境中非常常用的设计模式,这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示,迭代器模式属于行为模式。

核心角色

角色 描述
Iterator 定义遍历集合的接口,如hasNext()、next()等方法。
ConcreteIterator 实现具体的遍历逻辑。
Aggregate 聚合类接口,定义创建迭代器的方法iterator()
ConcreteAggregate 具体聚合类,返回一个与该聚合结构匹配的迭代器。

示例代码

该模式常常用于Collection包中,譬如ListSet等实现了Iterator接口对其统一了行为并可以使用for/while增强。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Iterator 接口
public interface Iterator<T> {
boolean hasNext();
T next();
}

// ConcreteIterator 实现
public class ListIterator<T> implements Iterator<T> {
private T[] items;
private int position = 0;

public ListIterator(T[] items) {
this.items = items;
}

@Override
public boolean hasNext() {
return position < items.length;
}

@Override
public T next() {
return items[position++];
}
}

// Aggregate 接口
public interface Aggregate<T> {
Iterator<T> iterator();
}

// ConcreteAggregate 实现
public class ListAggregate<T> implements Aggregate<T> {
private T[] items;

public ListAggregate(T[] items) {
this.items = items;
}

@Override
public Iterator<T> iterator() {
return new ListIterator<>(items);
}
}

// Client 使用示例
public class Client {
public static void main(String[] args) {
String[] data = {"A", "B", "C"};
Aggregate<String> aggregate = new ListAggregate<>(data);
Iterator<String> iterator = aggregate.iterator();

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

特点与应用场景

  1. 优点

    • 解耦集合与遍历逻辑: 客户端不需要关心具体结构即可遍历。
    • 统一接口访问
    • 支持多种遍历方式: 排序、过滤filter、reduce、map、flatmap…
  2. 缺点

    • 增加类的数量,系统复杂度有所增加。一般由语言本身迭代维护,譬如JDK 1.5 扩展了Iterator、JDK 8增加了Stream等等。