概论
什么是迭代器模式?迭代器模式是提供一种方法访问一个容器对象中的各个元素,而又不需要暴露该对象的细节。
迭代器模式示例
迭代器模式中分为4种角色。
①抽象迭代器
②具体迭代器
③抽象容器
④具体容器
首先我们一个抽象迭代器,抽象迭代器中包含遍历到下一个元素、判断遍历是否已经到了尾部、删除当前指向的元素。
1 public interface Iterator { 2 3 public Object next(); 4 public boolean hasNext(); 5 public boolean remove(); 6 }
第3行,声明一个函数,获取下一个元素。
第4行,声明一个函数,判断是否还有下一个元素。
第5行,声明一个函数,删除元素。
我们再来新增一个具体的迭代器:源代码如下所示:
1 public class DefaultIterator implements Iterator { 2 3 private Vector vector = new Vector(); 4 public int cursor = 0; 5 6 public DefaultIterator(Vector vector) { 7 this.vector = vector; 8 } 9 10 @Override 11 public Object next() { 12 13 if(this.hasNext()) { 14 return this.vector.get(cursor++); 15 } 16 return null; 17 } 18 19 @Override 20 public boolean hasNext() { 21 if(this.cursor == this.vector.size()) { 22 return false; 23 } 24 return true; 25 } 26 27 @Override 28 public boolean remove() { 29 this.vector.remove(this.cursor); 30 return true; 31 } 32 }
第3行:声明成员属性Vector
第4行:声明成员属性Cursor
第6行:带参数构造函数,用于初始化。
我们自定义一个抽象的容器接口:包含新增元素,删除元素,获取迭代器。
1 public interface Collection { 2 public void add(Object object); 3 public void remove(Object object); 4 public Iterator iterator(); 5 }
我们再定义一个具体的容器:
1 public class DefaultIterator implements Iterator { 2 3 private Vector vector = new Vector(); 4 public int cursor = 0; 5 6 public DefaultIterator(Vector vector) { 7 this.vector = vector; 8 } 9 10 @Override 11 public Object next() { 12 13 if(this.hasNext()) { 14 return this.vector.get(cursor++); 15 } 16 return null; 17 } 18 19 @Override 20 public boolean hasNext() { 21 if(this.cursor == this.vector.size()) { 22 return false; 23 } 24 return true; 25 } 26 27 @Override 28 public boolean remove() { 29 this.vector.remove(this.cursor); 30 return true; 31 } 32 }
最后我们增加一个场景类Client:代码如下图所示:
1 public class Client { 2 3 public static void main(String[] args) { 4 Collection collection = new DefaultCollection(); 5 collection.add("111"); 6 collection.add("222"); 7 collection.add("333"); 8 9 Iterator iterator = collection.iterator(); 10 while (iterator.hasNext()) { 11 System.out.println(iterator.next()); 12 } 13 } 14 }
当然我们的容器存在是基于Vector,存储的形式有很多比如ArrayList,数组等等,当然不一定局限集合,比如缓存等。而迭代器模式在实际中往往不会自己去定义,而是直接采用Java提供的Iterator接口。
迭代器模式在Java中的应用
我们先看看一段很简单的代码:
1 public class Client2 { 2 3 public static void main(String[] args) { 4 List<String> list = new ArrayList<String>(); 5 list.add("aaa"); 6 list.add("bbb"); 7 8 Iterator<String> iterator = list.iterator(); 9 while (iterator.hasNext()) { 10 System.out.println(iterator.next()); 11 } 12 13 } 14 }
在做什么,很简单,对list做迭代。我们先来看一下ArrayList的类结构图:
从上图可以看出,ArrayList最顶层的接口是Iterable。然而,ArrayList中持有的真正的迭代器确实类自身的内部类Itr。这个类的父接口是Iterator<E>。而Iterable中所有的实现都是定义在这个内部类中。比如代码中的next、remove、hasNext等等。这几个方法中的原理,和我们上面例子非常的相似。