定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。它是一种对象行为型模式。
优点:
- 访问一个聚合对象的内容而无需暴露其内部表示;
- 遍历任务交给迭代器完成,这简化了聚合类;
- 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历;
- 增加新的聚合类和迭代器类都很方便,无需修改原有代码;
- 封装性良好,为遍历不同的聚合结构提供了一个统一的接口。
缺点:增加了类的个数,这在一定程度上增加了系统的复杂性。
图示如下:
Aggregate接口:抽象聚合角色,定义存储、添加、删除聚合对象以及创建迭代器对象的接口;
ConcreteAggregate类:具体聚合角色,实现抽象聚合接口,返回一个具体迭代器的实例;
Iterator接口:抽象迭代器角色,定义访问和遍历聚合元素的接口,通常包含hasNext()、first()、next()等方法;
Concretelterator类:具体迭代器角色,实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
Java中已经定义了Iterable和Iterator接口,我们可以直接使用。
举例:
ConcreteAggregate类:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ConcreteAggregate<T> implements Iterable<T> { // ConcreteAggregate类
private List<T> list = new ArrayList<T>();
public void add(T t) {
list.add(t);
}
public void remove(T t) {
list.remove(t);
}
@Override
public Iterator<T> iterator() {
return new ConcreteIterator<T>(list);
}
}
Concretelterator类:
import java.util.Iterator;
import java.util.List;
public class ConcreteIterator<E> implements Iterator<E> {
private List<E> list = null;
private int index = 0;
public ConcreteIterator(List<E> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return index < list.size();
}
@Override
public E next() {
E e = list.get(index);
index++;
return e;
}
}
Client:
import java.util.Iterator;
public class Client { // Client
public static void main(String[] args) {
ConcreteAggregate<String> aggregate = new ConcreteAggregate<String>();
aggregate.add("a");
aggregate.add("b");
aggregate.add("c");
Iterator<String> iterator = aggregate.iterator(); // get the iterator
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
结果:
a
b
c