迭代器模式(Iterator pattern)
一、 引言
迭代这个名词对于熟悉 Java 的人来说绝对不陌生。我们常常使用 JDK 提
供的迭代接口进行 java collection 的遍历:
Iterator it = list.iterator();
while(it.hasNext()){
//using “it.next();”do some businesss logic
}
而这就是关于迭代器模式应用很好的例子。
二、 定义与结构
迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF 给出的定义
为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴
露该对象的内部细节。
从定义可见,迭代器模式是为容器而生。很明显,对容器对象的访问必然
涉及到遍历算法。你可以一股脑的将遍历方法塞到容器对象中去;或者根本不
去提供什么遍历算法,让使用容器的人自己去实现去吧。这两种情况好像都能
够解决问题。
然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”内
的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍
历状态保存的问题,不能对同一个容器对象同时进行多个遍历。第二种方式倒
是省事,却又将容器的内部细节暴露无遗。
而迭代器模式的出现,很好的解决了上面两种情况的弊端。先来看下迭代
器模式的真面目吧。
迭代器模式由以下角色组成:
1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代
器接口,并要记录遍历中的当前位置。
3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接
口。
4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接
口——这个具体迭代器角色于该容器的结构相关。
迭代器模式的类图如下: