迭代器模式就像我们平时去图书馆借书一样。图书馆里有很多书,但我们不可能一次性把所有书都带出来看,所以图书馆提供了一个“借书员”(迭代器)来帮助我们一本一本地借书。这个“借书员”知道如何按顺序找到每一本书,并且每次只给我们一本书。这样,我们就可以通过“借书员”来遍历图书馆中的所有书籍,而不需要关心图书馆内部是如何存放这些书的。
在编程中,迭代器模式也是这样一种思想。当我们需要遍历一个聚合对象(如列表、集合等)中的元素时,我们不需要了解该聚合对象的内部结构,只需要通过迭代器来按顺序访问每一个元素即可。这样,我们就将遍历的逻辑与聚合对象的内部结构解耦了,使得代码更加灵活和可重用。
Java示例代码:
首先,我们定义一个迭代器接口(Iterator),它规定了遍历元素所需的方法:
public interface Iterator<T> {
boolean hasNext(); // 判断是否还有下一个元素
T next(); // 返回下一个元素
}
然后,我们定义一个聚合对象的接口(如List),它包含一个返回迭代器的方法:
public interface List<T> {
Iterator<T> iterator(); // 返回一个迭代器,用于遍历列表中的元素
// ... 其他方法,如add、remove等
}
接下来,我们创建一个具体的聚合对象类(如ArrayList),它实现了List接口,并提供了相应的迭代器实现:
import java.util.Iterator;
public class ArrayList<T> implements List<T> {
private Object[] elements;
private int size;
// 构造函数、add、remove等方法省略...
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < size;
}
@Override
public T next() {
if (!hasNext()) {
throw new IllegalStateException("No more elements");
}
return (T) elements[currentIndex++];
}
};
}
// ... 其他方法实现省略
}
最后,我们创建一个客户端类来演示如何使用迭代器遍历列表中的元素:
public class Client {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); // 假设ArrayList已经实现了List接口和相应方法
list.add("Book 1");
list.add("Book 2");
list.add("Book 3");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String book = iterator.next();
System.out.println("Reading: " + book);
}
}
}
在这个例子中,ArrayList是聚合对象,它实现了List接口,并提供了自己的迭代器实现。客户端代码通过调用list.iterator()方法获取迭代器,然后使用while循环和迭代器的hasNext()、next()方法来遍历列表中的每一个元素。这样,客户端代码就不需要关心ArrayList的内部结构,只需要通过迭代器来访问元素即可。