一.模式定义
迭代器(Iterator Pattern)模式:它提供一个对象来顺序访问 聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式可以为不同容器提供一致的遍历行为,而不用关心容器内容元素组成结构,迭代器模式是一种对象行为型模式 。 迭代器模式是通过将聚合对象的遍历行为分离出来,抽象成迭代器类来实现的,其目的是在不暴露聚合对象的内部结构的情况下,让外部代码透明地访问聚合的内部数据。现在我们来分析其基本结构与实现方法。
二.模式结构
抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
/**抽象容器:Aggregate 接口
* 所要遍历的集合的接口。实现了该接口的类将成为一个可以保存多个元素的集合,类似数组。
* Aggregate接口中声明的方法为iterator,作用为生成一个用于遍历的迭代器。
*/
public interface Aggregate<E>{
public abstract Iterator iterator();
}
抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
public interface Iterator {
Object next();
boolean hasNext();
boolean remove();
}
具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
public class ConcreteAggregate implements Aggregate {
LinkedList<Object> list = new LinkedList<>();
@Override
public Iterator iterator() {
return new ConcreteIterator(list);
}
}
具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
public class ConcreteIterator implements Iterator {
private LinkedList<Object> list;
private int index = 0;
public ConcreteIterator(LinkedList<Object> list){
this.list = list;
index = 0;
}
@Override
public Object next() {
if(this.hasNext())
return list.get(index++);
else
return null;
}
@Override
public boolean hasNext() {
return index < list.size() && list != null;
}
@Override
public boolean remove() {
list.remove(index);
return true;
}
}
三.模式优势
访问一个聚合对象的内容而无须暴露它的内部表示。 需要为聚合对象提供多种遍历方式。 为遍历不同的聚合结构提供一个统一的接口。 多态迭代:为不同的聚合结构提供一致的遍历接口,即一个迭代接口可以访问不同的集合对象; 简化集合对象接口:迭代器模式将集合对象本身应该提供的元素迭代接口抽取到了迭代器中,使集合对象无须关心具体迭代行为 ; 元素迭代功能多样化:每个集合对象都可以提供一个或多个不同的迭代器,使的同种元素聚合结构可以有不同的迭代行为; 解耦迭代与集合 :迭代器模式封装了具体的迭代算法,迭代算法的变化,不会影响到集合对象的架构