Java设计模式之迭代器模式

概论

什么是迭代器模式?迭代器模式是提供一种方法访问一个容器对象中的各个元素,而又不需要暴露该对象的细节。

迭代器模式示例

迭代器模式中分为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等等。这几个方法中的原理,和我们上面例子非常的相似。

原文地址:https://www.cnblogs.com/candies123/p/10115828.html