迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种访问聚合对象中各个元素的方法,而无需暴露聚合对象的内部表示。迭代器模式将遍历和操作聚合对象的责任分离,使得遍历算法可以独立于聚合对象变化而变化。
在迭代器模式中,聚合对象包含一个迭代器接口,定义了访问和遍历元素的方法。具体的聚合对象实现该接口,返回一个具体的迭代器对象。迭代器对象负责追踪聚合对象中的当前位置,并提供访问和操作元素的方法。
迭代器模式的核心思想是将遍历算法和聚合对象解耦,使得它们可以独立演化。这样可以提供多种不同的遍历方式,而无需修改聚合对象的结构。
迭代器模式通常包含以下组件:
import java.util.ArrayList;
import java.util.List;
// 迭代器接口
interface Iterator {
boolean hasNext();
Object next();
}
// 聚合接口
interface Aggregate {
Iterator createIterator();
}
// 具体迭代器
class ConcreteIterator implements Iterator {
private List<Object> items;
private int position = 0;
public ConcreteIterator(List<Object> items) {
this.items = items;
}
public boolean hasNext() {
return position < items.size();
}
public Object next() {
if (this.hasNext()) {
return items.get(position++);
}
return null;
}
}
// 具体聚合类
class ConcreteAggregate implements Aggregate {
private List<Object> items = new ArrayList<>();
public Iterator createIterator() {
return new ConcreteIterator(items);
}
public void addItem(Object item) {
items.add(item);
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.addItem("Item 1");
aggregate.addItem("Item 2");
aggregate.addItem("Item 3");
Iterator iterator = aggregate.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
在上述示例中,我们定义了迭代器接口(Iterator)和聚合接口(Aggregate)。具体迭代器(ConcreteIterator)实现了迭代器接口,负责追踪聚合对象中的当前位置并提供访问元素的方法。具体聚合类(ConcreteAggregate)实现了聚合接口,创建具体的迭代器对象。在客户端代码中,我们创建了具体聚合对象,并使用迭代器对象来遍历和访问聚合对象中的元素。
这个示例展示了如何使用Java实现迭代器模式,通过迭代器对象来遍历和访问聚合对象中的元素,而无需了解聚合对象的内部表示。
迭代器模式在源码中有很多应用。以下是一些常见的源码中使用迭代器模式的情况:
优点:
迭代器模式提供了一种简化和统一的方式来遍历集合对象,隐藏了集合的内部结构,提供了多种遍历方式。虽然引入了额外的类和复杂性,但它提供了灵活性和可维护性。在设计中,需要权衡迭代器模式的优点和缺点,确保合理使用。