迭代器模式(Iterator)

📖 迭代器模式(Iterator)

迭代器模式是一种行为设计模式,它通过提供统一的遍历接口,解耦集合数据的存储结构与遍历逻辑,使客户端无需了解集合内部实现即可访问元素。


✨ 模式动机

在软件开发中,集合对象的存储结构可能会随着需求变化而改变,但客户端代码通常只关心如何遍历集合中的元素。迭代器模式通过引入一个迭代器对象,隐藏集合的复杂实现,使得客户端代码可以以一致的方式访问集合中的元素。


🛠️ 模式结构

迭代器模式的主要结构包括:

  1. 迭代器接口(Iterator):定义遍历元素的方法。
  2. 具体迭代器(Concrete Iterator):实现迭代器接口,负责具体的遍历逻辑。
  3. 集合接口(Aggregate):定义创建迭代器的方法。
  4. 具体集合(Concrete Aggregate):实现集合接口,返回具体迭代器实例。

💻 示例代码

以下是一个使用 Java 实现迭代器模式的示例:

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
59
// 定义迭代器接口
public interface Iterator<T> {
boolean hasNext();
T next();
}

// 定义集合接口
public interface Aggregate<T> {
Iterator<T> createIterator();
}

// 具体集合实现
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> items = new ArrayList<>();

public void addItem(T item) {
items.add(item);
}

@Override
public Iterator<T> createIterator() {
return new ConcreteIterator<>(items);
}
}

// 具体迭代器实现
public class ConcreteIterator<T> implements Iterator<T> {
private List<T> items;
private int position = 0;

public ConcreteIterator(List<T> items) {
this.items = items;
}

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

@Override
public T next() {
return items.get(position++);
}
}

// 客户端代码
public class Client {
public static void main(String[] args) {
ConcreteAggregate<String> aggregate = new ConcreteAggregate<>();
aggregate.addItem("A");
aggregate.addItem("B");
aggregate.addItem("C");

Iterator<String> iterator = aggregate.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}

📚 优缺点

优点

  1. 提供统一的遍历接口,简化客户端代码。
  2. 支持多种遍历方式(正序、逆序等)。
  3. 符合单一职责原则和开闭原则。

缺点

  1. 增加了类的数量,可能导致系统复杂性提高。
  2. 对于简单集合,使用迭代器可能显得多余。

🔗 相关设计模式

  • 组合模式(Composite):与迭代器模式结合使用,可以遍历复杂的树形结构。
  • 访问者模式(Visitor):可以与迭代器模式结合,处理集合中的元素。

📖 附录

📘 推荐阅读

  • 《设计模式:可复用面向对象软件的基础》——Erich Gamma 等
  • 《Head First 设计模式》——Eric Freeman 等

🔗 参考链接