1、定义
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
2、使用场景
小明和小王一同上了公交车,车上都是成人,售票员从头到尾一个个提醒乘客付费买票,当然售票员也可以从尾到头的方式进行提醒乘客买票。任何一个车上的人都需要一个一个买票。
3、代码结构UML图
Aggregate:聚集抽象类
Iterator:迭代抽象类,用于定义得到的开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法,统一接口。
ConcreteAggregate:具体聚集类,继承Aggrete;
ConcreteIterator:具体迭代器类,继承Iterator,实现开始、下一个、是否结尾、当前对象等方法。
4、类的实现
(1)、Aggregate (聚集抽象类)
public abstract class Aggregate {
public abstract Iterator createIterator();
}
(2)、ConcreteAggregate (具体聚集类)
public class ConcreteAggregate extends Aggregate {
private List<Object> items = new ArrayList<>();
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
public int getCount() {
return items.size();
}
public Object getItems(int index) {
return items.get(index);
}
public void setItems(int index, Object object) {
this.items.add(index, object);
}
}
(3)、Iterator (迭代器抽象类)
public abstract class Iterator {
public abstract Object first();
public abstract Object next();
public abstract boolean isDone();
public abstract Object currentItem();
}
(4)、ConcreteIterator (具体迭代器类)
public class ConcreteIterator extends Iterator {
private int current = 0;
private ConcreteAggregate aggregate;
public ConcreteIterator(ConcreteAggregate aggregate) {
this.aggregate = aggregate;
}
@Override
public Object first() {
return aggregate.getItems(0);
}
@Override
public Object next() {
Object ret = null;
current++;
if (current < aggregate.getCount()) {
ret = aggregate.getItems(current);
}
return ret;
}
@Override
public boolean isDone() {
return current >= aggregate.getCount() ? true : false;
}
@Override
public Object currentItem() {
return aggregate.getItems(current);
}
}
5、客户端调用
public static void main(String[] args) {
ConcreteAggregate a = new ConcreteAggregate();
a.setItems(0, "上");
a.setItems(1, "下");
a.setItems(2, "左");
a.setItems(3, "右");
Iterator iterator = new ConcreteIterator(a);
Object item = iterator.first();
while (!iterator.isDone()) {
System.out.println(iterator.currentItem()+" 请买车票");
iterator.next();
}
}
6、总结
总体来说,迭代器(Iterator)模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。
参考:《大话设计模式》