迭代器模式
今天要说的迭代器模式,实际上就是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迭代器类的。
不积跬步,无以至千里;不积小流,无以成江海。