跳到主要内容

定义

迭代器模式是一个设计时很少用到的、但编码实现时却经常使用到的行为型设计模式。在绝大部分编程语言中,迭代器已经成为一个基础的类库,直接用来遍历集合对象。在实际的开发中,更多的是直接使用它,很少从零去实现一个迭代器。

迭代器模式(Iterator Pattern)又叫做游标(Cursor)模式,它的原始定义是:迭代器提供一种对容器对象中的各个元素进行访问的方法,而又不暴露该对象的的内部细节。

  • Collection: 集合存储数据
  • Iterator: 遍历功能

在软件系统中,容器对象有两个职责:一是存储数据,二是遍历数据。从依赖性上看,前者是聚合对象的基本职责,而后者是可变化的,又是可分离的,因此可以将遍历数据的行为从容器中抽取出来,封装到迭代器对象中,由迭代器来提供遍历数据的行为,这将简化聚合对象的设计,更符合单一职责原则。

模式原理

/**
* 迭代器接口
*/
public interface Iterator<E> {

//判断集合中是否有下一个元素
boolean hasNext();

// 将游标后移一位
void next();

// 返回当前游标指定的元素
E current();

}

/**
* 具体的的迭代器
*
* @param <E>
*/
public class ConcreteIterator<E> implements Iterator<E> {

private int cursor;
// 容器
private List<E> arrayList;

public ConcreteIterator(List<E> arrayList) {
this.arrayList = arrayList;
this.cursor = 0;
}

@Override
public boolean hasNext() {
return cursor != arrayList.size();
}

@Override
public void next() {
cursor++;

}

@Override
public E current() {
if (cursor >= arrayList.size()) {
throw new NoSuchElementException();
}
return arrayList.get(cursor);
}
}

应用案例

总结

优点

  • 迭代器模式支持以不同方式遍历一个集合对象,在同一个集合对象上可以定义多种遍历方式,在迭代器模式中只需要用一个不同的迭代器替换原有的迭代器,即可改变遍历算法,也可以自己定义迭代器的子类以支持新的遍历方式。

  • 迭代器简化了集合类,由于引入了迭代器,在原有的集合对象中不再需要自行提供数据遍历等方式,这样可以简化集合类的设计。

  • 在迭代器模式中,由于引入了抽象层,增加新的集合类和迭代器都很方便,无需修改原有代码,满足 基于接口而非实现编程 和 开闭原则。

缺点

  • 由于迭代器模式将存储数据和遍历数据的职责分离,增加了类的个数,在一定程度上增加了系统的复杂性。
  • 抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展。

使用场景

  • 减少程序中重复的遍历代码: 迭代器模式是将遍历算法作为容器对象自身的一种属性方法来使用,能够有效避免写很多重复的代码,同时又不会暴露内部结构。
  • 当需要为遍历不同的集合结构提供一个统一的接口或者当访问一个集合对象的内容而无需暴露其内部细节的表示时。