定义:
定义了遍历和访问元素的接口,一般声明如下方法:用于获取第一个元素的first(),用于访问下一个元素的next(),用于判断是否还有下一个元素的hasNext(),用于获取当前元素的currentItem()。
模式分析:
包含聚合和迭代器两个层次结构:聚合是一个管理和组织数据对象的数据结构,聚合应该包含两个功能,一是存储数据,二是遍历内部数据。迭代器模式把聚合的两个功能进行分离,使用专门的迭代器来完成遍历聚合对象中的数据的功能。
示例代码:
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("小明");
ag.add("小红");
ag.add("小刚");
Iterator it = ag.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str);
}
}
}
角色:
- 抽象迭代器类:只做一件事情,定义所有的数据遍历方法,向前向后,访问指定元素,访问当前元素,判断下一个元素是否存在,判断是否是最后一个元素等等。
- 具体迭代器类:实现抽象迭代器类,实现所有方法,数据来自构造方法的参数注入,
- 抽象聚合类:负责聚合所有数据,定义数据结构,提供一个获取迭代器对象的接口方法public Iterator iterator();
- 具体聚合类:实现抽象聚合类接口,实现接口方法返回一个具体的迭代器对象,return new ConcreteIterator(list);把数据交给具体迭代器。
具体聚合类依赖具体迭代器类!
类图
核心理解
迭代器模式做的事情是把数据结构本身以及数据的遍历分离,在定义了一个聚合的数据结构的同时,就需要给这个数据结构实现一个具体的迭代器类,具体的迭代器类通过自身的构造方法获取聚合数据完成一系列遍历方法,具体的聚合类通过一个获取迭代器的方法调用具体迭代器类的构造方法把数据交给迭代器,用户在使用的时候,只需要直接调用聚合类的获取迭代器的方法来进行遍历操作,不需要知道遍历是谁完成的,是在哪完成的如何完成的。