迭代器模式(Iterator Pattern)是最常被使用的几个模式之一,被广泛地应用到Java的API中。
定义:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。
类图如下所示。

迭代器模式有以下4个角色。
- 抽象迭代器(Iterator)角色:负责定义访问和遍历元素的接口。
- 具体迭代器(Concrete Iterator)角色:实现Iterator接口,完成容器元素的遍历。
- 抽象聚集(Aggregate)角色:提供创建迭代器角色的接口。
- 具体聚集(Concrete Aggregate)角色:实现抽象聚集接口,创建出容纳迭代器的对象。
Iterator.java
- public interface Iterator {
- public Object next();
- public boolean hasNext();
- }
ConcreteIterator.java
- public class ConcreteIterator implements Iterator {
- private ConcreteAggregate agg;
- private int index = 0;
- private int size = 0;
- public ConcreteIterator(ConcreteAggregate agg) {
- this.agg = agg;
- size = agg.size();
- index = 0;
- }
- @Override
- public Object next() {
- if (index < size) {
- return agg.getElement(index++);
- } else {
- return null;
- }
- }
- @Override
- public boolean hasNext() {
- return index < size;
- }
- }
Aggregate.java
- public interface Aggregate {
- public void add(Object obj);
- public Iterator createIterator();
- }
ConcreteAggregate.java
- public class ConcreteAggregate implements Aggregate {
- private Vector vector = new Vector();
- @Override
- public void add(Object obj) {
- this.vector.add(obj);
- }
- public Object getElement(int index) {
- if (index < this.vector.size()) {
- return vector.get(index);
- } else {
- return null;
- }
- }
- public int size() {
- return vector.size();
- }
- @Override
- public Iterator createIterator() {
- return new ConcreteIterator(this);
- }
- }
Client.java
- public class Client {
- public static void main(String[] args) {
- // 定义聚集对象
- Aggregate agg = new ConcreteAggregate();
- agg.add("张三");
- agg.add("李四");
- agg.add("王五");
- // 遍历
- Iterator iterator = agg.createIterator();
- while (iterator.hasNext()) {
- System.out.println(iterator.next());
- }
- }
- }
运行结果如下所示。
优点:
- 简化了访问容器元素的操作,具备一个统一的遍历接口。
- 封装遍历算法,使算法独立于聚集角色。客户无须知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历进程。
缺点:
应用场景:
- 在java开发中,尽量不要自己写迭代器模式,使用Java API提供的Iterator一般就能满足项目要求。
摘自:
青岛东合信息技术有限公司 . 设计模式(Java版) . 电子工业出版社,2012,133-138.