定义
迭代器模式,提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部实现。
Java 中的 Collection、List、Set、Map 等都包含了迭代器,是迭代器模式最典型示例。




模式结构与实现
UML图

Code
public abstract class Aggregate {
public abstract Iterator getIterator();
public abstract void add(Object obj);
public abstract void remove(Object obj);
}
public abstract class Iterator {
public abstract Object first();
public abstract Object next();
public abstract boolean hasNext();
}
public class ConcreteAggregate extends Aggregate {
private List<Object> items = new ArrayList<Object>();
@Override
public Iterator getIterator() {
return new ConcreteIterator(items);
}
@Override
public void add(Object obj) {
items.add(obj);
}
@Override
public void remove(Object obj) {
items.remove(obj);
}
}
public class ConcreteIterator extends Iterator {
private List<Object> items = new ArrayList<Object>();
private int count = 0;
public ConcreteIterator(List<Object> items) {
this.items = items;
}
@Override
public Object first() {
return items.get(0);
}
@Override
public Object next() {
return items.get(count++);
}
@Override
public boolean hasNext() {
return count >= items.size();
}
}
public class Client {
public static void main(String[] args) {
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.add("江湾");
aggregate.add("李坑");
aggregate.add("思溪延村");
aggregate.add("晓起村");
aggregate.add("菊径村");
Iterator iterator = aggregate.getIterator();
System.out.println("首个景点:" + iterator.first());
while (!iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
总结
优点
- 访问一个聚合对象的内容而无须暴露它的内部实现,满足“开闭原则”。
- 遍历任务交由迭代器完成,这简化了聚合类,满足“单一职责原则。
- 支持以不同方式遍历一个聚合。
- 增加新的聚合类和迭代器类都很方便,无须修改原有代码。
- 封装性良好,为遍历不同的聚合结构提供一个统一的接口。
缺点
- 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐。
网友评论