GOF給出的定義爲:提供一種方法訪問一個容器(container)對象中各個元素,而又不需暴露該對象的內部細節。迭代器模式是爲容器而生。
對容器中元素的遍歷,有兩種方式:1)將遍歷方法塞到容器對象中去;2)容器本身不提供遍歷算法,讓使用容器的人自己去實現去。
問題所在:方法一種容器承受了過多的功能,它不僅要負責自己“容器”內的元素維護(添加、刪除等等),而且還要提供遍歷自身的接口;而且由於遍歷狀態保存的問題,不能對同一個容器對象同時進行多個遍歷。第二種方式卻又將容器的內部細節暴露無遺。
迭代器模式的出現,很好的解決了上面兩種情況的弊端
這裏講的就是java中迭代器的實現,以Java 的Collection API設計來看,在JDK 1.4時,iterator()方法是定義在Collection接口上,每個Collection的實現都會有iterator()方法,在 JDK5之後,iterator()方法定義在Iterable接口上,而Collection接口則繼承了Iterable接口.如圖所示.
因爲對象的實現方式不同,所以一般iterator放在實現內部作爲內部類實現。
此處舉一個例子,包括collection接口,iterator接口,arrayList實現類:
collection接口:內涵iterator接口的iteartor()方法,對外提供;
public interfaceCollection {
voidadd(Object o);
intsize();
Iteratoriterator();
}
Iterator接口,對外提供hasNext,next兩個方法;
public interfaceIterator {
booleanhasNext();
Objectnext();
}
collection的實現類,其中包括add,size,iterator方法的實現,並且iterator() 方法的返回一個arrayListIterator內部類的對象,對象提供hasNext,next兩個方法,
public classArrayList implements Collection {
privateObject[] objects = new Object[10];
private intindex = 0;
publicvoid add(Object o) {
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++;
}
publicint size() {
returnobjects.length;
}
publicArrayListIterator iterator() {
returnnew ArrayListIterator(); // 如果是單例可以不用new,直接用就行
}
privateclass ArrayListIterator implements Iterator {
int currentIndex = 0;//內部類實現iterator
@Override
publicboolean hasNext() { //接口實現類需要提供的方法
if(currentIndex >= index)
returnfalse;
Else return true;
}
@Override
publicObject next() { //接口實現類需要提供的方法
Objecto = objects[currentIndex];
currentIndex++;
returno;
}}}
這是1.4的做法,將iterator放在collection中,作爲一個屬性,這裏這個不是重點,重點是這種結構:每個collcetion的對象中包含一個用內部類實現iterator接口的對象,用來操作本類的讀取!這種設計太巧妙了!!同時以後可以大膽的用內部類哈!
更好的操作時在封裝一個foreach方法,itertor的操作做進一步封裝,如strategy中的TextCharChange,本身只做封裝而用;
最好是將其放在iterator內部類中,封裝hasNext,和it,next兩個方法!但是,因爲內部需要對每個元素做處理,所以放在內部還是不太合適,可以放在要做處理的外面的類中,或者測試類中!
public static voidforeach(IterableString iterator) {
Iteratorit = iterator.iterator();
while(it.hasNext()) {
System.out.println(it.next());
//換成處理的語句!
}}
這種方法,相當於通過iterator()方法,把一個collection類中的對外提供操控這個類中的元素的接口,統一爲iteartor對象,並提供hasnext,next兩個方法進行真實的操作!
這個想法太好了,但是其實,本質上也是一種封裝,對訪問collecion對象的方法的封裝!巧妙就在他的iterator()方法,返回的是一個iterator對象,這個對象有兩個方法可以操作collection中的元素!方法返回一個對象!!
我覺得應該用處很大,但是現階段還不知道能用在哪兒!