迭代器模式(Iterator Pattern)是一种行为型设计模式,主要用于提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露其内部表示。这个模式常被用于集合类对象(如列表、数组、图等)的实现中。
模式结构
迭代器模式包括以下几个核心角色:
- 迭代器接口(Iterator)
定义访问和遍历元素的接口,一般包括:- hasNext():判断是否还有下一个元素。
- next():返回下一个元素。
- remove()(可选):移除当前元素。
- 具体迭代器(Concrete Iterator)
实现迭代器接口,维护遍历的状态(如当前位置),负责实际遍历操作。 - 聚合接口(Aggregate)
定义创建迭代器的接口,一般包括:- createIterator():返回一个具体迭代器实例。
- 具体聚合(Concrete Aggregate)
实现聚合接口,提供存储和管理元素的功能,并返回具体迭代器。
优缺点
- 优点
封装性:迭代器将遍历的实现从集合中分离出来,不暴露集合的内部结构。
多样性:可以为不同的集合设计不同的迭代方式(如顺序迭代、反向迭代)。
一致性:为不同集合提供统一的遍历接口,方便调用。 - 缺点
开销增加:增加了类的数量和复杂性,尤其是需要为每种聚合都设计一个具体迭代器时。
不适合简单集合:对于非常简单的集合,直接遍历更高效。
适用场景
需要访问一个集合对象,而无需了解其底层实现。
需要以不同方式遍历集合。
需要为一个集合提供多种遍历方式。
示例代码
复制代码
// 迭代器接口
interface Iterator<E> {
boolean hasNext();
E next();
}
// 聚合接口
interface Aggregate<E> {
Iterator<E> createIterator();
}
// 具体聚合
class ConcreteAggregate<E> implements Aggregate<E> {
private List<E> items = new ArrayList<>();
public void addItem(E item) {
items.add(item);
}
@Override
public Iterator<E> createIterator() {
return new ConcreteIterator<>(items);
}
}
// 具体迭代器
class ConcreteIterator<E> implements Iterator<E> {
private List<E> items;
private int position = 0;
public ConcreteIterator(List<E> items) {
this.items = items;
}
@Override
public boolean hasNext() {
return position < items.size();
}
@Override
public E next() {
return hasNext() ? items.get(position++) : null;
}
}
// 测试
public class IteratorPatternDemo {
public static void main(String[] args) {
ConcreteAggregate<String> aggregate = new ConcreteAggregate<>();
aggregate.addItem("A");
aggregate.addItem("B");
aggregate.addItem("C");
Iterator<String> iterator = aggregate.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
实际应用
Java 中的集合框架(如 ArrayList、HashMap)都实现了迭代器模式,提供 Iterator 接口来遍历集合。
数据库游标(Cursor)也是迭代器模式的一个应用。