一、概述
迭代器模式(Iterator),提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示 。
二、UML图示
三、代码实现
1、迭代器抽象类
public abstract class Iterator {
public abstract Object first();
public abstract Object next();
public abstract boolean isDone();
public abstract Object currentItem();
}
2、聚集抽象类
public abstract class Aggregate {
public abstract Iterator createIterator();
}
3、具体迭代器
public class ConcreteIterator extends Iterator {
private ConcreteAggregate concreteAggregate;
private int current = 0;
public ConcreteIterator(ConcreteAggregate concreteAggregate) {
this.concreteAggregate = concreteAggregate;
}
@Override
public Object first() {
return concreteAggregate.getObject(0);
}
@Override
public Object next() {
Object o = null;
current++;
if(current < concreteAggregate.count()){
o = concreteAggregate.getObject(current);
}
return o;
}
@Override
public boolean isDone() {
return current >= concreteAggregate.count()?true:false;
}
@Override
public Object currentItem() {
return concreteAggregate.getObject(current);
}
}
4、具体聚集类
public class ConcreteAggregate extends Aggregate {
private List<Object> list = new ArrayList<>();
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
public int count(){
return list.size();
}
public Object getObject(int index) {
return list.get(index);
}
public void setObject(int index,Object o) {
this.list.add(index,o);
}
}
5、测试类
public class Test {
public static void main(String[] args) {
ConcreteAggregate concreteAggregate = new ConcreteAggregate();
concreteAggregate.createIterator();
concreteAggregate.setObject(0,"张三");
concreteAggregate.setObject(1,"李四");
concreteAggregate.setObject(2,"王五");
Iterator iterator = new ConcreteIterator(concreteAggregate);
Object o = iterator.first();
while (!iterator.isDone()){
System.out.println(iterator.currentItem()+":请买车票!");
iterator.next();
}
}
}
输出:
张三:请买车票!
李四:请买车票!
王五:请买车票!
注:参考文献《大话设计模式》程杰著。