18.2.5 通过实例来认识迭代器的实现
下面通过一个实例,演示如何实现Java Collection中的迭代器。
1.迭代器的代码实现
【实例18.3】迭代器模式的设计代码如下所示。
01 ///迭代器角色,仅仅定义了遍历接口
02 public interface Iterator
03 {
04 boolean hasNext();
05 Object next();
06 void remove();
07 }
08 ///容器角色,这里以List为例。它也仅仅是一个接口,就不罗列出来了
09 ///具体容器角色,是实现了List接口的ArrayList等类。为了突出重点这里只介绍和迭代器相关
10 ///的内容
11 ///具体迭代器角色,它是以内部类的形式出来的。AbstractList是为了将各个具体容器角色的公
12 ///共部分提取出来而存在的
13 public abstract class AbstractList implements List
14 {
15 ……
16 ///这个便是负责创建具体迭代器角色的工厂方法
17 public Iterator iterator(){
18 return new Itr();
19 }
20 ///作为内部类的具体迭代器角色
21 private class Itr implements Iterator
22 {
23 int cursor=0;
24 int lastRet=-1;
25 int expectedModCount=modCount;
26 public boolean hasNext()
27 {
28 return cursor!=size();
29 }
30 public Object next()
31 {
32 checkForComodification();
33 try{
34 Object next=get(cursor);
35 lastRet=cursor++;
36 return next;
37 }
38 catch(IndexOutOfBoundsException e){
39 checkForComodification();
40 throw new NoSuchElementException();
41 }
42 }
43 public void remove()
44 {
45 if(lastRet==-1)
46 throw new IllegalStateException();
47 checkForComodification();
48 try
49 {
50 AbstractList.this.remove(lastRet);
51 if(lastRet<cursor)
52 cursor—;
53 lastRet=-1;
54 expectedModCount=modCount;
55 }
56 catch(IndexOutOfBoundsException e){
57 throw new ConcurrentModificationException();
58 }
59 }
60 final void checkForComodification()
61 {
62 if(modCount!=expectedModCount)
63 throw new ConcurrentModificationException();
64 }
65 }
【代码说明】至于迭代器模式的使用,要先得到具体容器角色,然后再通过具体容器角色,得到具体迭代器角色。这样就可以使用具体迭代器角色来遍历容器。上述代码并不是完整的程序,只是演示各个角色的创建过程。
说明
本章介绍的大部分都是理论知识,主要是让读者有一个数据结构的概括知识,重要的实例都在下一章介绍。
在实现自己的迭代器时,一般要操作的容器有支持的接口才可以,而且还要注意以下问题:
❑在迭代器遍历的过程中,通过该迭代器进行容器元素的增减操作是否安全?
❑在容器中存在复合对象的情况,迭代器怎样才能支持深层遍历和多种遍历?
以上两个问题对于不同结构的容器角色,各不相同,值得考虑。
2.迭代器的适用情况
由上面的讲述可以看出,迭代器模式给容器的应用带来以下好处:
❑支持以不同的方式遍历一个容器角色,根据实现方式的不同,效果上会有差别。
❑简化了容器的接口,但是在Java Collection中为了提高可扩展性,容器还是提供了遍历的接口。
❑对同一个容器对象,可以同时进行多个遍历,因为遍历状态保存在每一个迭代器对象中。
由此得出迭代器模式的适用范围:
❑访问一个容器对象的内容而无须暴露它的内部表示。
❑支持对容器对象的多种遍历。
❑为遍历不同的容器结构提供一个统一的接口(多态迭代)。
迭代器的出现,避免了在数据结构中频繁地操作数据,同时也避免了代码的复杂性,为程序员提供了很大的方便。在实际开发的很多实例中,都将会使用到迭代器,方便程序员在数据结构中进行查询、添加、删除元素等操作。迭代器模式在现实的应用中很广泛,特别是在以后的数据库程序开发中。
学习完本章后,读者可能觉得概念还是有点模糊。没有关系,本章只是讲述数据结构的一些基本的、概念性的知识,没有涉及具体的实例。但从下一章开始,会使用实例讲解它们的具体用法,并使用实例来验证本章所讲述的知识点。