Java迭代器设计模式
定义
迭代器模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。 这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
对应角色
- 抽象迭代器(Iterator)角色:该角色负责定义访问和遍历元素的接口;
- 具体迭代器(Concrete Iterator)角色:该角色实现 Iterator 接口,完成容器元素的遍历;
- 抽象聚集(Aggregate)角色:该角色提供创建迭代器角色的接口;
- 具体聚集(ConcreteAggregate)角色:该角色实现抽象聚集类,返回一个具体迭代器的实例。
优缺点
优点
- 分离了集合对象的遍历行为,抽象出了迭代器负责集合对象的遍历,可以让外部的代码透明地访问集合内部的数据;
- 迭代器为遍历不同的聚合对象提供了一个统一的迭代接口,从而简化了客户端的调用;
- 访问一个聚合对象时,无需暴露该聚合对象的内部表示,从而提高聚合对象的封装性。
缺点
- 类的个数成对增加;
- 迭代器模式将存储数据和遍历数据两个职责拆分,增加了系统复杂性;
- 如果新添加一个集合类,需要增加该集合类对应的迭代器类,类的个数成对增加,在一定程度上增加了系统复杂性。
应用场景
- 当集合内部为复杂的数据结构,且你希望对客户端隐藏其复杂性时,可以使用迭代器模式;
- 如果希望有多种遍历方式可以访问聚合对象,可以使用迭代器模式;
- 如果希望不同的聚合对象有一个统一的遍历接口,可以使用迭代器模式。
实例
import java.util.Iterator;
public class MyIterator implements Iterator {
private int[] data;
private int index = 0;
public MyIterator(int[] data) {
this.data = data;
}
public boolean hasNext() {
if (index < data.length) {
return true;
} else {
return false;
}
}
public Object next() {
if (this.hasNext()) {
return data[index++];
} else {
return null;
}
}
public void remove() {
throw new UnsupportedOperationException("remove unsupported");
}
}