设计模式之迭代器模式
此模式看下图就知道了,用来遍历访问ArrayList中数据对象,而不会暴露内部逻辑。
在ArrayList中有一个迭代器,Itr,用来访问ArrayList中的数据。
一般调用方式如下,
List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
把ArrayList源码提取出来,去掉和上面迭代无关的代码,变成如下样子,
public class ArrayList<E> implements List<E>{
private int size; //下面数组的长度
transient Object[] elementData;
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor;
public boolean hasNext() {
return cursor != size; //当前游标没有到最大长度,表示还有下一个
}
public E next() {
int i = cursor;
Object[] elementData = ArrayList.this.elementData;
cursor = i + 1; //获取完数据后,游标下移一位
return (E) elementData[i];
}
}
}
从上面调用list.iterator()其实是获取了一个内部类,这个内部类用来通过next()遍历数组,而我们不用关心next()中是怎么实现的,只需要调用即可。
再看iterator()这个方法,是不是很像工厂方法,而ArrayList就是这个工厂,用来生产迭代器对象。