迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
迭代器模式(Iterator)实际上在Java的集合类中已经广泛使用了。我们以List为例,要遍历ArrayList,即使我们知道它的内部存储了一个Object[]数组,也不应该直接使用数组索引去遍历,因为这样需要了解集合内部的存储结构。如果使用Iterator遍历,那么,ArrayList和LinkedList都可以以一种统一的接口来遍历:
for(Iterator<String> it = list.iterator();it.hasNext()){
String s = it.next();
}
不需要知道其内部结构,只调用其迭代器获取对象
Java允许我们直接把任何支持Iterator的集合对象用foreach循环写出来:
List<String> list = ...
for (String s : list) {
}
然后由Java编译器完成Iterator模式的所有循环代码。
如何实现一个Iterator
AbstractList中有内部类Itr implements Iterator
Collection接口继承了Iterable接口
public class ReverseArrayCollection<T> implements Iterable<T> {
private T[] array;
public ReverseArrayCollection(T... array) {
this.array = array;
}
// 返回一个 iterator 对象
@Override
public Iterator<T> iterator() {
return new ReverseArrayIterator();
}
class ReverseArrayIterator implements Iterator<T> {
int index;
public ReverseArrayIterator() {
// 由于倒序 index 在数组的末尾
this.index = ReverseArrayCollection.this.array.length;
}
@Override
public boolean hasNext() {
// 如果index大于零则代表可以向前遍历
return index > 0;
}
@Override
public T next() {
return array[--index];
}
}
}