定义
提供一种方法访问一个容器对象中的各个元素,而又不需要暴露该对象内部的各个细节。
迭代器模式的角色
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)
文章转载于:https://www.jianshu.com/p/b7b55c013a54
原著是一个有趣的人,若有侵权,请通知删除
还没有人抢沙发呢~