定义
提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。
UML类图
代码实现
Iterator.java
public interface Iterator {
public void first();
public void next();
public boolean hasNext();
public Object currentItem();
}
Aggregate.java
public interface Aggregate {
public Iterator createIterator();
}
ConcreteIterator.java
public class ConcreteIterator implements Iterator {
private int cursor;
private List<String> list;
public ConcreteIterator(List<String> list) {
this.list = list;
}
@Override
public void first() {
cursor = 0;
}
@Override
public void next() {
cursor++;
}
@Override
public boolean hasNext() {
if (cursor < list.size()) {
return true;
}
return false;
}
@Override
public Object currentItem() {
return list.get(cursor);
}
}
ConcreteAggregate.java
public class ConcreteAggregate implements Aggregate {
private List<String> list;
public ConcreteAggregate() {
list = new ArrayList<>();
}
public void add(String value) {
list.add(value);
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(list);
}
}
Main.java
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.add("A");
aggregate.add("C");
aggregate.add("D");
aggregate.add("F");
Iterator iterator = aggregate.createIterator();
iterator.first();
while(iterator.hasNext()) {
String value = (String) iterator.currentItem();
iterator.next();
System.out.println("value:"+value);
}
打印结果:
value:A
value:C
value:D
value:F
优缺点
主要优点
-
它支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法,我们也可以自己定义迭代器的子类以支持新的遍历方式。
-
迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计。
-
在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。
主要缺点
-
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
-
抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展,例如JDK内置迭代器Iterator就无法实现逆向遍历,如果需要实现逆向遍历,只能通过其子类ListIterator等来实现,而ListIterator迭代器无法用于操作Set类型的聚合对象。在自定义迭代器时,创建一个考虑全面的抽象迭代器并不是件很容易的事情。