文章摘要: 迭代器模式使用总结。
简介
简要说明
- 迭代器模式(Iterator Pattern)是一种行为型设计模式。
- 允许客户端通过一个统一的接口遍历聚合对象中的元素,而无需关心聚合对象的内部结构。
主要功能
- 提供一种方法顺序访问一个聚合对象中各个元素,而不暴露其内部的表示。
- 支持对聚合对象的多种遍历方式。
- 为遍历不同的聚合结构提供一个统一的接口。
注意事项
- 迭代器模式可能会增加系统的复杂性,因为需要定义额外的迭代器接口和实现。
- 在某些情况下,迭代器可能会造成遍历过程中的性能问题。
适用场景
- 当需要访问一个聚合对象的内容,而不暴露其内部表示时。
- 当需要支持对聚合对象的多种遍历方式时。
- 当需要为遍历不同的聚合结构提供一个统一的接口时。
Java 8
案例
import java.util.*;
// 迭代器接口
interface Iterator {
boolean hasNext();
Object next();
}
// 聚合接口
interface Aggregate {
Iterator createIterator();
}
// 具体的聚合类
class ConcreteAggregate implements Aggregate {
private List<Object> items = new ArrayList<>();
public void addItem(Object item) {
items.add(item);
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
// 内部类,具体的迭代器实现
private class ConcreteIterator implements Iterator {
private int index;
private ConcreteAggregate aggregate;
public ConcreteIterator(ConcreteAggregate aggregate) {
this.aggregate = aggregate;
index = 0;
}
@Override
public boolean hasNext() {
return index < aggregate.items.size();
}
@Override
public Object next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return aggregate.items.get(index++);
}
}
}
// 客户端代码
public class IteratorPatternDemo {
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();
// 使用迭代器遍历聚合对象中的元素
System.out.println("Iterating over aggregate:");
while (iterator.hasNext()) {
Object item = iterator.next();
System.out.println(item);
}
}
}
注释
- 在这个例子中,
Iterator接口定义了遍历聚合对象所需的方法:hasNext()用于判断是否还有下一个元素,next()用于获取下一个元素。 Aggregate接口定义了创建迭代器的方法createIterator()。ConcreteAggregate类是具体的聚合类,它内部维护了一个元素列表,并提供了一个方法addItem()用于添加元素。同时,它实现了createIterator()方法,返回一个ConcreteIterator实例。ConcreteIterator是ConcreteAggregate的内部类,实现了Iterator接口。它负责跟踪聚合对象中的当前位置,并提供遍历元素的方法。- 在客户端代码
IteratorPatternDemo中,我们创建了一个ConcreteAggregate实例,并添加了一些元素。然后,我们通过调用createIterator()方法获取迭代器,并使用它来遍历聚合对象中的所有元素。这样,客户端代码无需关心聚合对象的内部结构,就可以顺序访问其元素。