迭代器设计模式

前言

为什么会有迭代器?
当我们想要 遍历取出集合一组数据时,一般都是用for里面套着i循环,或者使用for(对象 x :某个集合)的形式取出,不过因为集合类型的不同,取出的形式也不同,但是当我们想要一种统一的方法去遍历集合时,就可以用迭代器去实现,说了那么多,不如来一个直观的例子。

Alt text
这里模仿Arraylist集合中的迭代器实现过程,其中
Iterator:执行递增遍历的接口
Collection:一些集合的上层接口
Arraylist: 目前只实现了add、size及迭代器
ArrayListIterator: 用于Arraylist的迭代器

Iterator接口

1
2
3
4
5
6
public interface Iterator {
//取得下一个元素
Object next();
//检查有没有下一个元素
boolean hasNext();
}

Collection接口

1
2
3
4
5
public interface Collection {
public void add(Object o);//增加一个对象
public int size();//返回长度
Iterator iterator();//内聚迭代器
}

Arraylist类(这里ArrayListIterator是其内部类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package com.zwl.iterator;
public class ArrayList implements Collection{
//默认都是初始化为10的
Object objects[]=new Object[10];
//默认集合长度都为0的
int index=0;
//增加方法
public void add(Object o){
//集合长度动态增长,每次都使其长度增加2倍,并且创建一个增长后的新数组
//将旧数组先copy给新数组,在指向旧数组的引用
//同时保证每添加一个对象,集合长度自增长,这样就不会出现越界情况
if(index==objects.length){
Object newobjects[]=new Object[objects.length*2];
System.arraycopy(objects, 0, newobjects, 0, objects.length);
objects=newobjects;
}
objects[index]=o;
index++;
}
//返回集合长度
public int size(){
return index;
}
//统一迭代器方法
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return new ArrayListIterator();
}
//内部类,返回arraylist的专有迭代器
private class ArrayListIterator implements Iterator{
//取集合中对象的索引
private int currentIndex=0;
//取出集合中当前索引的一个对象
@Override
public Object next() {
Object o = objects[currentIndex];
currentIndex ++;
return o;
}
//判断集合是否含有下一个元素
@Override
public boolean hasNext() {
//索引值超出集合长度,集合中元素取完
if(currentIndex>=index) return false;
else
return true;
}
}
}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
Collection al=new ArrayList();
for(int i=0;i<15;i++){
al.add(new Object());
}
System.out.println(al.size());
Iterator it=al.iterator();
while(it.hasNext()){
Object o=it.next();
System.out.println(o+" ");
}
}

至此,可以归纳一下迭代器设计模式的一般形式
Alt text

其中:
1:Iterator(迭代器) 参与者:
定义访问和遍历元素的接口(如Iterator)

2.ConcreteIterator(具体迭代器)参与者
实现迭代器的接口(如ArrayListIterator)

3.Aggregate(聚合)参与者
定义建立Iterator参与者的接口(如Collection)

4.ConcreteAggregate(具体聚合)参与者
实现Aggregate所定义的接口(如Arraylist)

最后不得不提的是,无论一个集合实现的结果如何,都能使用iterator,此外,我们通过改变iterato,来增加各种iterator,如反向遍历,双向遍历(即,增加一个previous方法),只要注意一下currentInde和index就可以了

热评文章