1. 模式意图
别名游标(Cursor),提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部对象。
这一模式的关键思想是将对列表/聚合的访问和遍历从聚合对象中分离出来并放入一个迭代器对象中。迭代器类定义一个访问该聚合元素的接口。迭代器对象负责跟踪当前的元素:即,它知道哪些元素已经遍历过了。
将遍历机制与聚合对象分离使我们可以定义不同的迭代器来实现不同的遍历策略。
迭代器和聚合是耦合在一起的,而且客户对象必须知道遍历的聚合结构。最好能有一种办法使得不需改变客户代码即可改变该聚合类。可以通过将迭代器的概念推广到多态迭代来达到这个目标。
创建迭代器,要让聚合对象负责创建相应的迭代器。客户请求调用该操作以获得一个迭代器对象。
在同一个聚合上可以有多个遍历,每个迭代器保持它自己的遍历状态。因此,可以同时进行多个遍历。
2. 模式定义
迭代器(Iterator): 迭代器定义访问和遍历元素的接口。
具体迭代器(ConcreteIterator): 具体迭代器实现迭代器接口;对该聚合遍历时跟踪当前位置。
聚合(Aggregate): 聚合定义创建相应迭代器对象的接口。
具体聚合(ConcreteAggregate):具体聚合实现创建相应迭代器的接口。
3. 模式实现
3.1 Java实现迭代器模式
interface Iterator {
public Object next();
public boolean hasNext();
}
class ConcreteIterator implements Iterator{
private List list = new ArrayList();
private int cursor =0;
public ConcreteIterator(List list){
this.list = list;
}
public boolean hasNext() {
if(cursor==list.size()){
return false;
}
return true;
}
public Object next() {
Object obj = null;
if(this.hasNext()){
obj = this.list.get(cursor++);
}
return obj;
}
}
interface Aggregate {
public void add(Object obj);
public void remove(Object obj);
public Iterator iterator();
}
class ConcreteAggregate implements Aggregate {
private List list = new ArrayList();
public void add(Object obj) {
list.add(obj);
}
public Iterator iterator() {
return new ConcreteIterator(list);
}
public void remove(Object obj) {
list.remove(obj);
}
}
public class Client {
public static void main(String[] args){
Aggregate ag = new ConcreteAggregate();
ag.add("1");
ag.add("2");
ag.add("3");
Iterator it = ag.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str);
}
}
}
4. 模式应用