一、介绍
- 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式
- 如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决
- 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构
二、原理类图
2.1 角色和职责
■ 抽象迭代器(Iterator)角色:该角色负责定义访问和遍历元素的接口。
■ 具体迭代器(Concrete Iterator)角色:该角色实现Iterator接口,完成容器元素的遍历。
■ 抽象聚集(Aggregate)角色:该角色提供创建迭代器角色的接口。
■ 具体聚集(Concrete Aggregate)角色:该角色实现抽象聚集接口,创建出容纳迭代器的对象。
2.2 代码分析
- 抽象迭代器Iterator的代码如下所示:
【代码 5-15】 Iterator.java
public interface Iterator {
public Object next();
public boolean hasNext();
}
- 具体迭代器ConcreteIterator的代码如下所示。
【代码 5-16】 ConcreteIterator.java
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;
}
// 是否有下一个元素,即还没遍历结束
public boolean hasNext() {
return index < size;
}
//返回下一个元素
public Object next() {
if (index < size) {
return agg.getElement(index++);
} else {
return null;
}
}
}
- 抽象聚集Aggregate的代码如下所示。
【代码 5-17】 Aggregate.java
public interface Aggregate {
public void add(Object obj);
public Iterator creatIterator();
}
- 具体聚集ConcreteAggregate的代码如下所示。
【代码 5-18】 ConcreteAggregate.java
public class ConcreteAggregate implements Aggregate {
private Vector vector = new Vector();
public void add(Object object) {
this.vector.add(object);
}
public Object getElement(int index) {
if (index < vector.size()) {
return vector.get(index);
} else {
return null;
}
}
public int size() {
return vector.size();
}
public Iterator creatIterator() {
return new ConcreteIterator(this);
}
}
- 应用类代码如下所示。
【代码 5-19】 Client.java
public class Client {
public static void main(String agrs[]) {
// 定义聚集对象
Aggregate agg = new ConcreteAggregate();
agg.add("张三");
agg.add("李四");
agg.add("王五");
// 遍历
Iterator iterator = agg.creatIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
- 运行结果如下所示:
张三
李四
王五
三、 优缺点
3.1 优点:
- 迭代器模式简化了访问容器元素的操作,具备一个统一的遍历接口。
- 封装遍历算法,使算法独立于聚集角色。客户无须知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历过程。
3.2 缺点:
- 迭代器模式给使用者一个序列化的错觉,从而产生错误。
- 迭代器的元素都是Object类型,没有类型特征(JDK1.5后通过引入泛型可以解决此问题)。
注意:
在java开发中,尽量不要自己写迭代器模式,用java API提供的Iterator一般就能满足项目需求。