1、介绍
迭代器模式是最常用的几个模式之一,Java中的集合框架就是通过迭代器实现的。
Provide a way to access the elements of aggregate object sequentially without exposing its underlying representation.
提供一种方法访问一个容器对象中的各个元素,而又不暴露该对象的内部细节。
2、使用场景
遍历一个容器对象。Java语音中国,从JDK1.2版本开始,增加了java.util.Iterator接口,并将Iterator应用到各个聚集类Collection中,如:ArrayList、Vector、Stack等集合都实现类iterator()方法,返回一个迭代器,便于对集合中的元素进行遍历。因为Java中将迭代器融合到基本的API中,所以项目中无须独立地写迭代器。
3、UML类图
角色介绍:
- 抽象迭代器(Iterator)角色:该角色负责定义访问和遍历元素的接口。
- 具体迭代器(ConcreteIterator)角色:该角色实现Iterator接口,完成容器元素的遍历。
- 抽象聚集(Aggregate)角色:该角色负责定义创建迭代器角色的接口
- 具体聚集(ConcreteAggregate)角色:该角色负责实现抽象聚集接口,创建出容纳迭代器对象
4、示例
/**
* 抽象迭代器对象
* @author xiaofeizhu
*
*/
public interface Iterator {
// 返回下一个元素
public Object next();
// 是否有下一个元素
public boolean hasNext();
}
/**
* 具体迭代器
* @author xiaofeizhu
*
*/
public class ConcreteIterator implements Iterator {
private ConcreteAggregate agg;
private int index = 0;
private int size = 0;
public ConcreteIterator(ConcreteAggregate agg) {
this.agg = agg;
size = agg.size();
index = 0;
}
@Override
public Object next() {
if (index < size) {
return agg.getElement(index++);
}else{
return null;
}
}
@Override
public boolean hasNext() {
return index < size;
}
}
/**
* 抽象聚集类
* @author xiaofeizhu
*
*/
public interface Aggregate {
public void add(Object object);
public Iterator createIterator();
public int size();
}
/**
* 具体聚集
* @author xiaofeizhu
*
*/
public class ConcreteAggregate implements Aggregate {
Vector vector = new Vector<>();
@Override
public void add(Object object) {
vector.add(object);
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
@Override
public int size() {
return vector.size();
}
public Object getElement(int index) {
if (index >= 0 && index < vector.size()) {
return vector.get(index);
}else {
return null;
}
}
}
/**
* 测试类
* @author xiaofeizhu
*
*/
public class Client {
public static void main(String[] args) {
Aggregate aggregate = new ConcreteAggregate();
aggregate.add("旺旺");
aggregate.add("红红");
aggregate.add("猪猪");
Iterator iterator = aggregate.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
输出结果如下:
旺旺
红红
猪猪
5、总结
优点:
- 简化了访问容器元素操作,具体统一的遍历操作
- 封装遍历操作,使算法独立于聚集角色,用户无需知道聚集对象的类型,即使聚集对象类型发生改变,也不会影响遍历
缺点:
- 迭代器模式给使用至一个序列化的错觉
- 迭代器的元素都是Object类型,没有类型特征(JDK1.5后通过引入泛型后可以解决此问题)