Design Pattern -- Iterator

来源:互联网 发布:西门子plc200编程软件 编辑:程序博客网 时间:2024/06/05 10:16

就Java 开发者而言,Iterator 应该是比较容易理解的模式了。 因为用过Java 集合的人会记得有iterator() 这个函数。应用iterator() 返回Iterator 对象,然后对相应的集合元素进行操作,这就是经典的Iterator 的用法。(当然,Iteartor 还涉及另外一个模式,Factory, 这在之前已经讲过)。

在基本的Iterator 模式的定义里是这样讲的:“Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. ” 。 这里有两点:

1。访问聚合的对象( aggregate object),比如集合

2。不暴露内部细节( exposing its underlying representation.)

基本的模式图:

对于这个模式,本身的思想似乎没有什么可说的。但是有几点具体实现还是有必要提一下:

首先是对于Java 开发者,通常可以自定义自己的集合和Iterator 来提前实现集合元素类型转换等操作。在Java 源码中,我们看到通过运用Iterator 和Factory 两种模式,开发者将特定集合类型的Iterator 在该类内作为内部类(inner class) 实现。而当我们开发自己的集合以及Iterator 时,完全也可以这么做

第二,如果自定义记集合内元素是以复合(composite )结构存在的,那么遍历的实现就会有一些复杂。这时的设计可能还要参考Composite 模式的概念。

第三,在Iterate 的过程中,必须关注Thread-Safe 的问题。通常可以通过加互斥锁,或者用Synchronized解决,比如:

list = Collections.synchronizedList(sourceList);
synchronized(list){
...
}

(这里还有一个细节,在Java 中,如果用Iterator遍历操作集合元素,发生线程冲突而程序员没有进行处理的话,Java 会抛出ConcurrentModificationException 异常;而如果不用Iterator, 而只是for 循环,即使有线程问题存在异常也不会被抛出。)

总之,对于Java 开发者而言,Iterator 模式在大部分情况下是现成可用的。而如果要自定义进行开发,有些东西就必须小心了。

参考:

http://www.dofactory.com/Patterns/PatternIterator.aspx

http://squall.cs.ntou.edu.tw/cpp/91spring/Iterator.html

http://www.cnblogs.com/singlepine/archive/2005/10/30/265024.html

http://digi.it.sohu.com/20050508/n240036877.shtml

原创粉丝点击