迭代器模式

Posted CoderBuff

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器模式相关的知识,希望对你有一定的参考价值。

今天要说的迭代器模式,实际上就是Java已经为我们实现好了,那就是Java的Iterator类。包括很多编程语言也有自己的迭代器类,但同时它也是一个设计模式,所以在我们实现迭代器模式的时候实际上就是在实现一个迭代器类。

我们先来了解何为迭代器?其实你把它简单理解为for循环也没什么问题,可以说是它是for循环的高级形式。它提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。我们为它提供开始、下一个、是否结束等方法。

定义一个迭代器接口,包含以下方法。

 1 package day_28_iterator;
 2 
 3 /**
 4  * 迭代器接口
 5  * @author turbo
 6  *
 7  * 2016年9月29日
 8  */
 9 public interface Iterator {
10     Object first();    //第一个元素
11     Object next();    //下一个元素
12     boolean isFinished();    //是否到结尾
13     Object currentItem();    //当前遍历的对象
14 }

具体的迭代器类。

 1 package day_28_iterator;
 2 
 3 import java.util.Vector;
 4 
 5 /**
 6  * 具体迭代器类
 7  * @author turbo
 8  *
 9  * 2016年9月29日
10  */
11 public class ConcreteIterator implements Iterator {
12     private int currentIndex = 0;
13     private Vector vector = null;
14     
15     public ConcreteIterator(Vector vector){
16         this.vector = vector;
17     }
18     
19     /* (non-Javadoc)
20      * @see day_28_iterator.Iterator#first()
21      */
22     @Override
23     public Object first() {
24         currentIndex = 0;
25         return vector.get(currentIndex);
26     }
27 
28     /* (non-Javadoc)
29      * @see day_28_iterator.Iterator#next()
30      */
31     @Override
32     public Object next() {
33         return vector.get(currentIndex++);
34     }
35 
36     /* (non-Javadoc)
37      * @see day_28_iterator.Iterator#isFinished()
38      */
39     @Override
40     public boolean isFinished() {
41         if (currentIndex > this.vector.size() - 1){
42             return true;
43         } else {
44             return false;
45         }
46     }
47 
48     /* (non-Javadoc)
49      * @see day_28_iterator.Iterator#currentItem()
50      */
51     @Override
52     public Object currentItem() {
53         return currentIndex;
54     }
55 
56 }

定义一个聚合类接口,用来模拟集合。

 1 package day_28_iterator;
 2 
 3 /**
 4  * 聚集(集合)接口,模拟集合接口,增删
 5  * @author turbo
 6  *
 7  * 2016年9月29日
 8  */
 9 public interface Aggregate {
10     Iterator createIterator();    //创建迭代器
11     void add(Object obj);    //新增元素
12     void remove(Object obj);    //删除元素
13 }
 1 package day_28_iterator;
 2 
 3 import java.util.Vector;
 4 
 5 /**
 6  * 具体聚集类
 7  * @author turbo
 8  *
 9  * 2016年9月29日
10  */
11 public class ConcreteAggregate implements Aggregate {
12     private Vector vector = null;
13     
14     public void setVector(Vector vector) {
15         this.vector = vector;
16     }
17     public Vector getVector() {
18         return vector;
19     }
20     
21     public ConcreteAggregate(){
22         vector = new Vector();
23     }
24     
25     /* (non-Javadoc)
26      * @see day_28_iterator.Aggregate#createIterator()
27      */
28     @Override
29     public Iterator createIterator() {
30         return new ConcreteIterator(vector);
31     }
32     /* (non-Javadoc)
33      * @see day_28_iterator.Aggregate#add(java.lang.Object)
34      */
35     @Override
36     public void add(Object obj) {
37         this.vector.add(obj);
38     }
39     /* (non-Javadoc)
40      * @see day_28_iterator.Aggregate#remove(java.lang.Object)
41      */
42     @Override
43     public void remove(Object obj) {
44         this.vector.remove(obj);
45     }
46     
47 }

我们来看看客户端。

 1 package day_28_iterator;
 2 
 3 /**
 4  * @author turbo
 5  *
 6  * 2016年9月29日
 7  */
 8 public class Main {
 9 
10     /**
11      * @param args
12      */
13     public static void main(String[] args) {
14         Aggregate agg = new ConcreteAggregate();
15         agg.add("a");
16         agg.add("b");
17         agg.add("c");
18         Iterator iterator = agg.createIterator();
19         while (!iterator.isFinished()){
20             System.out.println(iterator.next());
21         }
22         
23     }
24 
25 }

这样我们就简单的实现了一个迭代器,当需要对聚集(集合)有多种方式遍历时,可以考虑用迭代器模式,在下一篇中,我们会去JDK源代码看看Java是如何实现Iterator迭代器类的。

 

以上是关于迭代器模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 行为型模式 -- 迭代器模式(定义结构实例优缺点分析)

Python 设计模式 — 行为型模式 — 迭代器模式

设计模式-迭代器模式

迭代器模式

Python 设计模式 — 行为型模式 — 迭代器模式

设计模式学习