Iterator

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中的元素!方法返回一個對象!!

我覺得應該用處很大,但是現階段還不知道能用在哪兒!


發佈了66 篇原創文章 · 獲贊 9 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章