迭代器

概念

意图

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

结构

207254216383.png

参与者

Iterator

  • 迭代器定义访问和遍历元素的接口。

ConcreteIterator

  • 具体迭代器实现迭代器接口。

  • 对该聚合遍历时跟踪当前位置。

Aggregate

  • 聚合定义创建相应迭代器对象的接口。

ConcreteAggregate

  • 具体聚合实现创建相应迭代器的接口,该操作返回 ConreteIterator 的实例。

适用性

在以下情况下可以使用 Iterator 模式:

  • 访问一个聚合对象的内容而无需暴露它的内部表示。

  • 支持对聚合对象的多种遍历。

  • 为遍历不同的聚合结构提供一个统一的接口。

效果

  • 它支持以不同的方式遍历一个聚合。

  • 迭代器简化了聚合的接口。

  • 在同一个聚合上可以有多个遍历。

相关模式

  • Iterator 常被应用到 Composite 这样的递归结构上。

  • 可以使用 Factory Method 模式来实例化多态迭代器。

  • Iterator 可以使用 Memento 来捕获一个迭代的状态,在内部存储 Memento。

Implementation

1
2
3
public interface Aggregate {
Iterator createIterator();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ConcreteAggregate implements Aggregate {

private Integer[] items;

public ConcreteAggregate() {
items = new Integer[10];
for (int i = 0; i < items.length; i++) {
items[i] = i;
}
}

@Override
public Iterator createIterator() {
return new ConcreteIterator<Integer>(items);
}
}
1
2
3
4
5
6
public interface Iterator<Item> {

Item next();

boolean hasNext();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ConcreteIterator<Item> implements Iterator {

private Item[] items;
private int position = 0;

public ConcreteIterator(Item[] items) {
this.items = items;
}

@Override
public Object next() {
return items[position++];
}

@Override
public boolean hasNext() {
return position < items.length;
}
}
1
2
3
4
5
6
7
8
9
10
public class Client {

public static void main(String[] args) {
Aggregate aggregate = new ConcreteAggregate();
Iterator<Integer> iterator = aggregate.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}

JDK