今天要说的迭代器模式,实际上就是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迭代器类的。