一、介绍
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。
你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。
为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
二、代码实现
//迭代器抽象类 public abstract class Iterator { //第一个 public abstract Object first(); //下一个 public abstract Object next(); //是否到最后 public abstract boolean isDone(); //当前对象 public abstract Object currentItem(); } //聚集抽象类 public abstract class Aggregate { //创建迭代器 public abstract Iterator createIterator(); } //具体聚集类 public class ConcreteAggregate extends Aggregate { private ArrayList<Object> items = new ArrayList<>(); @Override public Iterator createIterator() { return new ConcreteIterator(this); } //返回聚集总个数 public int getCount() { return items.size(); } //增加新对象 public void add(Object object) { items.add(object); } //得到指定索引的对象 public Object getCurrentItem(int index) { return items.get(index); } } //具体迭代器类 public class ConcreteIterator extends Iterator { private ConcreteAggregate aggregate; private int current = 0; public ConcreteIterator(ConcreteAggregate aggregate) { this.aggregate = aggregate; } @Override public Object first() { return aggregate.getCurrentItem(0); } @Override public Object next() { Object ret = null; current++; if (current < aggregate.getCount()) { ret = aggregate.getCurrentItem(current); } return null; } @Override public boolean isDone() { return current >= aggregate.getCount() ? true : false; } @Override public Object currentItem() { return aggregate.getCurrentItem(current); } }
测试
public static void main(String[] args) { ConcreteAggregate bus = new ConcreteAggregate(); bus.add("A"); bus.add("B"); bus.add("C"); bus.add("D"); bus.add("E"); bus.add("F"); bus.add("G"); Iterator c = new ConcreteIterator(bus); c.first(); while (!c.isDone()) { System.out.println(c.currentItem()); c.next(); } }