首页 > 代码库 > 迭代器模式

迭代器模式

今天要说的迭代器模式,实际上就是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     @Override23     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     @Override32     public Object next() {33         return vector.get(currentIndex++);34     }35 36     /* (non-Javadoc)37      * @see day_28_iterator.Iterator#isFinished()38      */39     @Override40     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     @Override52     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     @Override29     public Iterator createIterator() {30         return new ConcreteIterator(vector);31     }32     /* (non-Javadoc)33      * @see day_28_iterator.Aggregate#add(java.lang.Object)34      */35     @Override36     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     @Override43     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 args12      */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迭代器类的。

 

迭代器模式