迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)是Java中非常常用的模式,这种模式用于顺序访问集合对象的元素。属于行为型模式。

迭代器模式(Iterator Pattern)提供一种顺访问聚合对象中各元素的方法。

优点:

  1. 它支持不同的方式遍历一个聚合对象。
  2. 迭代器简化了聚合类,在同一个聚合类上可以有多个迭代器。
  3. 在迭代器模式中,增加新的聚合类和新的迭代器类都很方便,无序修改原有代码。

缺点:

  1. 由于迭代器模式将存储数据和遍历数据的职责分离,所以增加新的聚合类需要增加新的迭代器类,类的个数成对增加,如Java所有容器中都有相应的迭代器类,增加了系统的复杂性。

ArrayList容器里面的迭代器模式UML图如下所示:

迭代模式UML

迭代器类一般是一个容器类的内部类,由于内部类可以很方便的操作容器类的内部属性。

Collection接口:

1
2
3
public interface Collection<E> {
Iterator<E> iterator();
}

Iterator接口:

1
2
3
4
public interface Iterator<E> {
boolean hasNext();
E next();
}

ArrayList类:

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
public class ArrayList implements Collection {
transient Object[] elementData;
private int size; //the number of elements it contains

public Iterator<E> iterator() {
44return new Itr();
4}

private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;

// prevent creating a synthetic constructor
Itr() {}

public boolean hasNext() {
return cursor != size;
}

public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
}
}

Client类:

1
2
3
4
5
6
7
8
9
10
11
12
public class Client {
public static void main(String[] args) {
Collection<Integer> c = new ArrayList<>();
c.add(1);
c.add(2);
c.add(3);
Iterator<Integer> it = c.iterator();
while(it.hasNext()) {
System.out.print(it.next() + " ");
}
}
}

Java每个容器里都会提供迭代器。