定义
迭代器模式(Iterator Pattern)是使用率最高的几个模式之一,被广泛地应用到Java的API中。例如:Java的集合(Collection)框架中,就广泛使用迭代器来遍历集合中元素。
英文原话:Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
翻译:提供一种方法,访问一个容器对象中的各个元素,而又不暴露该对象的内部细节。
迭代器是为容器服务的,容器是指用来容纳其他对象的对象,例如:Collection集合类型、Set类型等。迭代器模式便于遍历和访问容器中的元素。
角色:
抽象迭代器(Iterator)角色:该角色负责定义访问和遍历元素的接口。
具体迭代器(Concrete Iterator)角色:该角色实现Iterator接口,完成容器元素的遍历。
抽象聚集(Aggregate)角色:该角色提供创建迭代器角色的接口。
具体聚集(Concrete Aggregate)角色:该角色实现抽象聚集接口,创建出容纳迭代器的对象。
/** * 抽象迭代器 */ public interface Iterator { //下一个 public Object next(); //是否有下一个 public boolean hasNext(); } /** * 具体迭代器 */ 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++); } return null; } /** * 是否有下一个元素,即是否遍历结束 */ @Override public boolean hasNext() { return index<size; } } /** * 聚集类接口 */ public interface Aggregate { public void add(Object obj); //添加元素 public Iterator creatIterator(); //创建迭代器 } /** * 具体聚集类 */ 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 < vector.size()){ return vector.get(index); }else { return null; } } public int size(){ return vector.size(); } //创建迭代器 @Override public Iterator creatIterator() { return new ConcreteIterator(this); } }
public static void main(String[] args) {
Aggregate agg = new ConcreteAggregate(); //相当于List list = new ArrayList();
agg.add("元素1");
agg.add("元素2");
agg.add("元素3");
//遍历
Iterator iterator = agg.creatIterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
优点
- 迭代器模式简化了访问容器元素的操作,具备统一的遍历接口。
- 封装遍历算法,使算法独立于聚集角色。客户无需知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历过程。
缺点
- 迭代器模式给使用者一种序列化的错觉,而产生错误。
- 迭代器的元素都是Object类型,没有类型特征(JDK1.5之后引入泛型可以解决此问题)。
应用场景
迭代器模式现在被广泛的应用甚至已经成为一个最基础的工具。有些人建议将迭代器从23中模式删除,其原因就是迭代器模式太普通了,它已经融入到各种语言和各工具中。在Java语言中,从JDK1.2版本开始,就增加了java.util.Iterator接口,并将Iterator应用到各个聚集类(Collection)中,如ArrayList、Vector、Stack、HashSet等集合类都实现了iterator()方法,返回一个迭代器Iterator,便于对集合中的元素进行遍历。也正因为Java已经将迭代器模式融入最基本的API中,程序员在项目中无需再独立的写迭代器,直接使用即可。