定义
提供一种方法访问一个容器对象中的各个元素,而又不需要暴露该对象内部的各个细节。
迭代器模式的角色
1:抽象迭代器角色(Iterator)
该角色负责定义访问和遍历元素的接口。
public interface Iterator{
public Object next();
public Object hasNext();
}
2:具体迭代器角色(ConcreteIterator)
该角色实现迭代器接口,完成容器元素的遍历。
public class ConcreateIterator implements Iterator{
private ConcreateAggregate agg;
private int index;
private int size;
public ConcreateIterator (ConcreateAggregate agg){
this.agg = agg;
this.index = 0;
this.size = agg.size;
}
//是否有下一个角色
public boolean hasNext(){
return index < size;
}
//获取下一个角色
public Object next(){
if(index < next){
return agg.getElement(index++);
}else{
return null;
}
}
}
3:抽象聚集(Aggregate)
该角色提供创建迭代器角色的接口。
public interface Aggregate{
public void add(Obejct obj);
public Iterator iterator();
}
4:具体聚集(ConcreateAggregate)
该角色实现抽象聚集接口,创建出胡容纳迭代器的对象。
public class ConcreateAggregate implements Aggregate{
public Vector vector = new Vector();
public void add(Object obj){
this.vector.add(obj);
}
public Object getElement(int index){
if(index < vector.size()){
return vector.get(index);
}else{
return null;
}
}
public int size(){
return this.vector.size();
}
public Iterator iterator(){
return new ConcreateIterator(this);
}
}
客户端代码:
public class Client{
public static void main(String [] args){
ConcreateAggregate agg = new ConcreateAggregate();
agg.add(1);
agg.add(2);
agg.add(3);
Iterator iterator = agg.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
优点
1:迭代器简化了访问容器元素的操作,具备一个统一访问的接口。
2:封装遍历算法,使算法独立于聚集角色,即是聚集对象类型变化,遍历算法也不会变化。
缺点
1:迭代器模式给使用者一种序列化的错觉,从而产生错误。
2:迭代器的元素都是Object类型,jdk1.5以后才有了泛型的概念。
使用场景
java.util.Iterator接口,就是原生的迭代器,实现的集合类有 Collection、ArrayList、Vector、Stack、HashSet、EntrySet等
目前迭代器模式因为jdk1.2以后有了java.util.Iterator,所以迭代器已经普遍应用于数组集合的遍历当中。
参考资料:设计模式(java)
网友评论