从Iterator Pattern说起
疑惑之初:
记得初次编程的时候,看到书上说过当要想实现对某个对象进行迭代器访问的方式时,需要实现一些特定的接口。
比如说我们想用如下的一段代码:
?
UserInfoArrayIterator的具体实现如下:
?
进一步改进:实际上,从图中我们可以看到,两个类UserInfoList和UserInfoArray都有一个方法createIterator()。它主要的目的就是用来返回自己特定的Iterator。如果我们将其进一步抽象的话。可以提取一个专门的接口,它主要就是返回一个Iterator类型的数据。这一步,又和我们面向对象设计原则中面向接口和抽象这一条暗合的。这么一步改进之后,对应的uml图则如下:
?
?
再回首:再回到开头提到的部分,我们要实现遍历一个对象的话,需要实现Iterable和Iterator两个接口。实际上实现Iterable接口是为了返回一个实际遍历元素的具体Iterator实现。而实现Iterator接口则是对具体类的遍历细节实现。
结论:总的来说,如果我们用一句话来概括Iterator Pattern的话,就是提供不同集合元素类的通用遍历方法。
1:为了能够采用通用的形式,我们将变化的部分封装成一个Iterator接口,通过实现这个接口来实现具体的遍历细节。对于使用迭代器的代码来说,就不需要关注遍历的细节了。
2: 为了更好的面向抽象而不是具体类,我们将返回一个具体Iterator的方法也抽象成了一个接口Iterable。
这两点就是Iterator Pattern的核心要旨。
参考材料:《Head first design patterns》 Iterator Pattern章节部分。
http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html
?
?
后续部分:Iterator Pattern在Java中间的实现和使用虽然带来了一定的便利,不过因为要定义一堆的接口和实现,看起来稍显麻烦。于是在别的语言里通过语法糖或者内部增强的方式极大的简化了Iterator Pattern定义和实现。比如说在c#语言中,采用yield return的语法糖,编译器把一些细节帮你给做了。而典型的动态语言如python,则有一套iterator的定义机制。进而演化出来了iterator和generator.这也是后续文章要继续讨论的话题。
1 楼 kensunhu 2012-06-12 Great explanation for iterator pattern,thanks!