1、简介
迭代器模式又叫游标模式,是对象的行为模式,迭代器模式可以顺序的访问一个聚集中的元素而不必暴露聚集的内部表象
2、迭代器模式的类图
3、迭代器模式涉及到的角色
从上图可以看出,迭代器模式涉及到以下几个角色
3.1、抽象迭代器角色:它定义了遍历元素所需要的接口
3.2、具体迭代器角色:实现抽象迭代器所声明的接口 并保持迭代过程中的游标位置
3.3、抽象容器角色:声明可以操作容器的方法,其中包括一个获取迭代器多想的方法
3.4、具体容器角色:实现抽象容器角色声明的方法。
4、源代码
4.1、抽象迭代器角色
package Iterator; /** * ******************************************************** * @ClassName: Iterator * @Description: 抽象迭代器角色 * ********************************************************** */ public interface Iterator { public boolean hasNext(); public Object next(); }
4.2、具体迭代器角色
package Iterator; /** * ******************************************************** * @ClassName: ConcreteIterator * @Description: 具体迭代器角色 * ********************************************************** */ public class ConcreteIterator implements Iterator{ private List list = null; private int index; public ConcreteIterator(List list) { super(); this.list = list; } @Override public boolean hasNext() { if (index >= list.getSize()) { return false; } else { return true; } } @Override public Object next() { Object object = list.get(index); index++; return object; } }
4.3、抽象容器角色
package Iterator; /** * ******************************************************** * @ClassName: List * @Description:抽象容器角色 * ********************************************************** */ public interface List { //定义集合可以进行的操作 public void add(Object obj); public Object get(int index); public Iterator iterator(); public int getSize(); }
4.4、具体容器角色
package Iterator; /** * ******************************************************** * @ClassName: ConcreteAggregate * @Description: 具体容器角色 * ********************************************************** */ public class ConcreteAggregate implements List{ private Object[] list; private int size=0; private int index=0; public ConcreteAggregate(){ index=0; size=0; list=new Object[100]; } @Override public void add(Object obj) { list[index++]=obj; size++; } @Override public Iterator iterator() { return new ConcreteIterator(this); } @Override public Object get(int index) { return list[index]; } @Override public int getSize() { return size; } }
4.5、测试客户端
package Iterator; /** * ******************************************************** * @ClassName: Client * @Description: 迭代器模式测试客户端 * ********************************************************** */ public class Client { public static void main(String[] args) { List list=new ConcreteAggregate(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); Iterator it=list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
5、测试,运行结果如下
6、总结
迭代器模式的优缺点:
- 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
- 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
- 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
迭代器模式的缺点:
- 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。
总的来说: 迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。