提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
迭代器模式(Iterator )实际上在 Java 的集合类中已经广泛使用了。主要用来提供一种统一的方法来遍历不同的聚合对象。
迭代器模式的核心角色。
- Iterator(迭代器接口) :定义访问和遍历元素的接口
- ConcreteIterator(具体迭代器) :实现迭代器接口,负责管理当前元素的位置
- Aggregate(聚合接口) :定义创建相应迭代器对象的接口
- ConcreteAggregate(具体聚合) :实现聚合接口,返回具体迭代器的实例
下面是一个完整的Java迭代器模式示例:
迭代器接口。
java
// 迭代器接口
interface Iterator<T> {
boolean hasNext();
T next();
}
聚合接口。
java
// 聚合接口
interface Container<T> {
Iterator<T> getIterator();
}
具体聚合类。
java
// 具体聚合类
class NameRepository implements Container<String> {
private List<String> names = new ArrayList<>();
public NameRepository(String[] names) {
for (String name : names) {
this.names.add(name);
}
}
@Override
public Iterator<String> getIterator() {
return new NameIterator();
}
// 具体迭代器类(内部类)
private class NameIterator implements Iterator<String> {
int index = 0;
@Override
public boolean hasNext() {
return index < names.size();
}
@Override
public String next() {
if (this.hasNext()) {
return names.get(index++);
}
return null;
}
}
}
客户端,测试代码。
java
// 客户端代码
public class IteratorPatternDemo {
public static void main(String[] args) {
String[] names = {"Robert", "John", "Julie", "Lora"};
NameRepository nameRepository = new NameRepository(names);
// 获取迭代器
Iterator<String> iterator = nameRepository.getIterator();
System.out.println("Names in repository:");
while (iterator.hasNext()) {
String name = iterator.next();
System.out.println("Name: " + name);
}
}
}
总结
迭代器模式经常被用在遍历集合上,集合通过对外提供统一的Iterator
接口来遍历元素,而客户端不需要了解集合内部的数据结构。
在 Java 中,迭代器模式被广泛应用于集合框架中,是处理集合元素遍历的标准方式。