Provide a way to access the elements of an aggregate object sequentially without exposing its underlying respresentation.
提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。
迭代器模式中的四个角色:
抽象迭代器(Iterator)模式:定义访问和遍历元素的接口具体迭代器(Concrete Iterator)模式:实现抽象迭代器,完成容器元素的遍历抽象聚集(Aggregate)角色:提供保存元素,创建迭代器角色的接口具体聚集(Concrete Aggregate)角色:实现抽象聚集,保存元素,创建迭代器对象优点:封装遍历算法,使算法独立于聚集角色,客户无需知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历过程
迭代器模式代码实现(泛型):
import java.util.Vector; public class IteratorModel { /* * 迭代器模式 */ public static void main(String[] args) { //创建聚集对象,并添加元素 Aggregate<String> aggregate=new ConcreteAggregate<String>(); aggregate.add("黯"); aggregate.add("叶"); aggregate.add("你"); aggregate.add("好"); aggregate.add("!"); //创建迭代器对象,遍历元素 Iterator<String> iterator=aggregate.iterator(); while(iterator.hasNext()){ System.out.print(iterator.next()); } } } //抽象迭代器接口 interface Iterator<E>{ public E next();//返回下一个元素 public boolean hasNext();//是否还有下一个元素 } //具体迭代器 class ConcreteIterator<E> implements Iterator<E>{ private Aggregate<E> aggregate=null; private int index; private int size; public ConcreteIterator(Aggregate<E> aggregate) { this.aggregate=aggregate; this.size=aggregate.size(); this.index=0; } @Override public boolean hasNext() { return index<size; } @Override public E next() { return aggregate.get(index++); } } //抽象聚集接口(Aggregate) interface Aggregate<E>{ public void add(E e);//添加元素 public Iterator<E> iterator();//创建迭代器对象 public int size();//元素个数 public E get(int index);//返回指定元素 } //具体聚集 class ConcreteAggregate<E> implements Aggregate<E>{ private Vector<E> vector=new Vector<E>(); @Override public void add(E e) { vector.addElement(e); } @Override public Iterator<E> iterator() { return new ConcreteIterator<E>(this); } @Override public int size() { return vector.size(); } @Override public E get(int index) { if(index<size()) { return vector.get(index); } return null; } }运行结果:
黯叶你好!参考书籍:
《大话设计模式》——程杰
《设计模式(Java版)》
参考文档:JDK API 1.6.0中文版
