概念
定义
迭代器(Iterator)模式的定义: 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
特点
迭代器模式是通过将聚合对象的遍历行为分离出来,抽象成迭代器类来实现的,其目的是在不暴露聚合对象的内部结构的情况下,让外部代码透明地访问聚合的内部数据。
迭代器模式具有以下优点:
- 访问一个聚合对象的内容而无须暴露它的内部表示。
- 遍历任务交由迭代器完成,这简化了聚合类。
- 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
- 增加新的聚合类和迭代器类都很方便,无须修改原有代码。
- 封装性良好,为遍历不同的聚合结构提供一个统一的接口。
应用场景
一般使用到大量同类型对象时会使用各类容器存放,而对容器的修改或是读取若是使用迭代模式将使程序更加完美。下图是使用迭代器Iterator
对容器的包装结构:
我们来看原生1.8版本JDK中迭代器使用的实例:
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
从这个Iterator
接口中我们可以看到,迭代器只有两个方法hasNext()
和next()
。其中hasNext()
是个布尔类型,用于判断容器是否取值结束;next()
则是返回取值内容。
实际应用也比较简单方便:
public class Main {
public static void main(String args[]) {
LinkedList<Integer> ll = new LinkedList<>();
for (int i = 0; i < 10; i++)
ll.addLast(i);
Iterator<Integer> it = ll.iterator();
while (it.hasNext())
System.out.print(it.next() + " ");
}
}
运行结果:
这里我们使用的是LinkedList,当然可以使用别的容器比如ArrayList或者HashList等。由上述代码可见,我们无需遍历容器来取值,这样使容器的对象内部结构不会暴露。