针对问题:提供统一接口访问集合,屏蔽集合内部数据的访问和数据结构。提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示。
迭代器模式的结构图:
迭代器模式的实现代码:
/**
* 迭代接口
* @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
*/
}
}