迭代器模式

本文最后更新于 2025年7月27日 下午

提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示。

角色

  1. 抽象迭代器 : 定义了访问和遍历元素的接口,然后在其子类中实现这些方法
  2. 具体迭代器 :实现抽象迭代接口,完成对集合对象的遍历,同时对遍历时的位置进行跟踪
  3. 抽象聚合类 : 用于存储对象,创建相应的迭代器对象的接口。它带有一个iterator()方法,用于创建迭代器对象
  4. 具体聚合类 :用于实现创建相应的迭代器对象的接口,以及iterator方法,并且返回于该具体聚合相对应的具体迭代器实例

场景

需要访问一个集合对象的内容,而又不想暴露它的内部表示。

需要对集合对象进行多种方式的遍历。

需要对多个不同结构的集合使用统一的遍历接口。

实现迭代器

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
60
61
// 定义迭代器接口
public interface MyIterator {
boolean hasNext();
Object next();
}

// 定义抽象聚合类
public interface MyContainer {
void add(Object obj);
void remove(Object obj);
MyIterator iterator();
}

// 实现类

public class ListContainer implements MyContainer {
private List<Object> list = new ArrayList<>();
@Override
public void add(Object obj){
list.add(obj);
}

@Override
public void remove(Object obj){
list.remove(obj);
}

@Override
public MyIterator iterator(){
return new MyIteratorImpl();
}

private class MyIteratorImpl implements MyIterator {
private int index = 0 ;
@Override
public boolean hasNext(){
return index >= list.size()? false : true ;
}

@Override
public Object next(){
Object obj = list.get(index);
index++;
return obj ;
}
}
}

// 调用
public class Test{
public static void main(String[] args){
ListContainer listContainer = new ListContainer();
listContainer.add("张三");
listContainer.add("李四");

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

总结

提供一种顺序访问聚合对象中各个元素的方法,而不暴露其内部结构。其核心思想是将集合的遍历行为抽象为一个独立的对象,使遍历过程与集合对象解耦,从而支持多个遍历器共存、统一接口访问不同类型的集合结构。


迭代器模式
http://gadoid.io/2025/07/27/迭代器模式/
作者
Codfish
发布于
2025年7月27日
许可协议