针对问题:提供统一接口访问集合,屏蔽集合内部数据的访问和数据结构。提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示。
迭代器模式的结构图:
迭代器模式的实现代码:
/** * 迭代接口 * @author bruce * */ public interface Iterator { public Object first(); public Object next(); public boolean isDone(); public Object currentItme(); } /** * 集合抽象类 * @author bruce * */ public abstract class Aggregate { public abstract Iterator createIterator(); } /** * 集合实现类 * @author bruce * */ public class ConcreteAggregate extends Aggregate{ private Object[] objects; public ConcreteAggregate(Object[] objects){ this.objects=objects; } @Override public Iterator createIterator() { return new ConcreteIterator(this); } /** * 迭代器应作为集合类的私有内部类来实现。这样可以访问集合,不需要以下接口。 * @return */ public Object[] getObjects(){ return objects; } } /** * 迭代器实现 * @author bruce * */ public class ConcreteIterator implements Iterator{ private ConcreteAggregate aggregate; private int current=0; public ConcreteIterator(ConcreteAggregate aggregate){ this.aggregate=aggregate; } public Object currentItme() { return getObjects()!=null && getObjects().length>current?getObjects()[current]:null; } public Object first() { return getObjects()!=null && getObjects().length>0?getObjects()[0]:null; } public boolean isDone() { return getObjects()!=null && getObjects().length>0?current>=getObjects().length:true; } public Object next() { // TODO Auto-generated method stub return isDone()?null:getObjects()[current++]; } /** * 迭代器应该实现在集合内部,不需要些接口 * @return */ private Object[] getObjects(){ return aggregate.getObjects(); } } /** * 测试类 * @author bruce * */ public class Client { public static void main(String[] args) { Object[] objects=new Object[]{"A","B","C"}; ConcreteAggregate aggregate=new ConcreteAggregate(objects); Iterator iterator=aggregate.createIterator(); while(!iterator.isDone()){ Object object=iterator.next(); System.out.println(object); } /** * output: A B C */ } }