迭代器模式
# 一、概述
迭代器(Iterator)模式提供一种遍历结合元素的统一接口,用一致的方法遍历集合元素,不需要关心集合对象的底层实现。
在 Java 中不需要自己实现迭代器模式,集合类就是迭代器模式的实现。
# 1.1 解决了什么问题
迭代器模式主要用在对集合数据进行遍历的场景下,JDK 就提供了 Iterable
接口,Collection
接口继承自Iterable
接口,所以Collection
的子类对客户端提供了统一的遍历方式。
但是Collection
的子类是有很多个的,每个子类内部实现是不一样的,所以各个子类的遍历方式或者说遍历的算法也是不一样的,而且同一个子类在不同的 JDK 版本中的内部实现也可能会有差异,但是无论 JDK 源码如何修改,都应该保持向后兼容,保证暴露给客户端的接口是不变的。
# 1.2 解决方案
迭代器模式的思想就是将集合的遍历行为抽取为单独的迭代器对象,实际上 JDK 源码就是这样干的。
# 二、实现方式
# 2.1 角色
- Iterator:迭代器,该接口声明了遍历集合所需的操作,获取下一个元素,获取当前位置等。
- Concrete Iterators:具体迭代器,实现遍历集合的各个接口。
- Collection:集合,该接口声明一个或多个方法来获取与集合兼容的迭代器。
- Concrete Collections:具体集合,会在客户端请求迭代器时返回一个特定的具体迭代器类实体。
# 2.2 代码
定义 Iterator 接口:
public interface MyIterator<E> {
boolean hasNext();
E next();
}
1
2
3
4
2
3
4
定义 Collection 接口:
public interface MyCollection<E> {
MyIterator<E> getIterator();
}
1
2
3
2
3
定义 Concrete Collection 和 Concrete Iterator:
public class MyList<E> implements MyCollection<E> {
private Object[] containor;
private int totalSize;
private int currSize;
public MyList(int size) {
this.totalSize = size;
this.containor = new Object[size];
}
public void add(E e) throws Exception {
if (this.currSize == this.totalSize) {
throw new Exception("容器已满");
}
containor[this.currSize] = e;
currSize++;
}
@Override
public MyIterator<E> getIterator() {
return new MyListIterator<E>();
}
private class MyListIterator<E> implements MyIterator<E> {
int index;
@Override
public boolean hasNext() {
if (this.index < currSize) {
return true;
}
return false;
}
@Override
public E next() {
if (this.hasNext()) {
return (E) containor[index++];
}
return null;
}
}
}
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
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
示例:
public class IteratorTest {
public static void main(String[] args) throws Exception {
MyList<String> myList = new MyList(10);
myList.add("1");
myList.add("2");
myList.add("3");
myList.add("4");
myList.add("5");
myList.add("6");
MyIterator<String> iterator = myList.getIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
1
2
3
4
5
6
2
3
4
5
6
# 三、源码中的应用
java.util.Iterator
上次更新: 2023/11/01, 03:11:44