简介
迭代器设计模式(Iterator Design Pattern),也叫作游标设计模式(Cursor Design Pattern)。
迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。
其定义是,提供一种方法来访问聚合对象,而不暴露这个对象的内部实现。
典型实现
首先,定义一个用于遍历聚合对象中所存储元素的抽象迭代器接口,其代码示例如下:
public interface Iterator {
// 将游标指向第一个元素
public void first();
// 将游标指向下一个元素
public void next();
// 判断是否存在下一个元素
public boolean hasNext();
// 获取游标指向的当前元素
public Object currentItem();
}
然后,我们通常将存储数据的类称作为聚合类,一般会在聚合类中创建迭代器对象,如下是抽象聚合接口的代码示例:
public interface Aggregate {
public Iterator creteIterator();
}
在具体迭代器类中,我们需要注入聚合对象,以便后续使用迭代器时能访问到其数据,其代码示例如下:
public class ConcreteIterator implements Iterator {
private Aggregate objects;
private Object cursor;
public ConcreteIterator(Aggregate objects) {
this.objects = objects;
}
// 将游标指向第一个元素
public void first() {}
// 将游标指向下一个元素
public void next() {}
// 判断是否存在下一个元素
public boolean hasNext() {}
// 获取游标指向的当前元素
public Object currentItem() {}
}
在具体聚合类中,通常是实现存储数据的逻辑,以及指定具体迭代器的对象,其代码示例如下:
public class ConcreteAggregate implements Aggregate {
public Iterator creteIterator() {
return new ConcreteIterator(this);
}
}
总结
优点
迭代器模式的主要优点如下:
- 封装性良好,访问一个聚合对象的内容而无需暴露它的内部实现
- 将遍历操作交给迭代器,简化了复杂聚合类的设计
- 支持以不同的方式遍历聚合对象,在同一个聚合对象上可以定义多种遍历方式
- 增加新的聚合类和迭代器类都很方便,满足开闭原则
缺点
迭代器模式的主要缺点如下:
- 迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加
- 抽象迭代器的设计难度较大,需要充分考虑系统将来的扩展
适用场景
迭代器模式的适用场景如下:
- 访问一个聚合对象的内容而无需暴露它的内部实现
- 需要为一个聚合对象提供多种遍历方式
- 为遍历不同的聚合对象提供一个统一的接口
源码
在 Java 中,迭代器的应用非常广。
最顶层的 Collection
集合接口继承了 Iterable
接口,其实表明了所有的集合对象都是可迭代对象,并且都需要实现获取 Iterator
对象的方法。
将这个源码映射到典型实现中,Iterable
接口和 Collection
接口就是抽象聚合接口,Iterator
接口则是抽象迭代器接口。