什么是迭代器模式?
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式可以基于特定接口按顺序访问集合中的各个元素,而且无需了解其具体特性。迭代器模式属于行为型模式。Java 集合的顶层接口 Collection 继承了 Iterable 接口,进而所有 Java 集合实现类全部要支持 iterator() 方法,就是迭代器模式一个具体应用。
优缺点
优点:
1.将聚合类中数据存储和数据遍历职责解耦,使得聚合类可以只关注自身数据结构。
2.客户端无需了解聚合类的数据结构,使用统一的 Iterator 接口来遍历数据。
3.聚合类可以拥有多种迭代器以供选择,不需要改动代码去调整遍历顺序。
缺点:
- 由于具体的遍历类和聚合类是成对出现的,因此类的数量会增加。
示例
// 抽象聚合类,定义 getIterator 的方法,要求所有具体聚合类要按照自己的数据结构去各自实现
abstract class Aggregate<E> {
protected abstract Iterator<E> getIterator();
}
// 迭代器接口,定义遍历元素所需的标准的操作方法
interface Iterator<E> {
boolean hasNext();
E next();
boolean isDone();
}
// 具体聚合类,其数据结构是个数组,当然也可以是ArrayList, Set, LinkedList 等等。
class NameList<E> extends Aggregate<E> {
private E[] elements;
public NameList(E[] elements) {
this.elements = elements;
}
@Override
public Iterator<E> getIterator() {
return new NameIterator<E>(elements);
}
}
// 具体迭代器,基于特定数据机构去实现遍历所需的方法
class NameIterator<E> implements Iterator<E> {
private E[] elements;
private int idx = 0;
public NameIterator(E[] elements) {
this.elements = elements;
}
@Override
public boolean hasNext() {
return idx + 1 <= elements.length;
}
@Override
public E next() {
if (idx < elements.length) {
return elements[idx++];
}
return null;
}
@Override
public boolean isDone() {
return idx >= elements.length;
}
}
// 测试类
public static void main(String[] args) {
final NameList<String> myList = new NameList<>(new String[] {"Lucien", "Fish", "LiuFu", "SiXi"});
final Iterator<String> nameIterator = myList.getIterator();
while (nameIterator.hasNext()) {
System.out.println(nameIterator.next());
}
}
Output
Lucien
Fish
LiuFu
SiXi