Java Iterator 設計模式看完之後覺得有點亂,整理下思路。
主要的結構圖如下所示:
其中ArrayList,LinkedList等 實現List,Collection接口,Collection 接口中有:add,remove,iterator三個方法,iterator()返回Iterator對象,Iterator本身是個接口,所以返回Iterator對象就是返回接口實現的類的對象,對應上圖中的ListIterator(此處容易出錯,圖中爲接口,因爲具體的實現一般在每個collection的實現中的內部類實現)。ListIterator中有兩個方法待重寫:hasNext(),next(),即Iteartor對象有這兩個方法。
通常,最終目的是實現對collection中內容的遍歷,所以只需要collection知道如何遍歷即可,所以iterator接口的實現一般放在collection實現的內部內種實現。所以總結下並對應上圖表現爲:ArrayList實現接口Collection,List,此接口中有3個方法需要重寫:add(),remove(),iterator()。iterator()返回Iterator對象。對象由ArrayList的內部類實現了ListIterator而得到,此接口中有兩個方法需要重寫:hasNext(),next()。
使用時,可以再寫個foreach() 方法,包含iterator方法.測試代碼如下:
public class testForeach {
public void foreach(IterableString iterator) { //把iterator的東西都集中放在一起了,使用時直接調用foreach即可。
Iterator it = iterator.iterator();
while (it.hasNext()) {
System.out.print(it.next());//可修改爲需要的處理方法
}}
@Test
public void testForeach() {
foreach(new IterableString("helo~java~~"));//真正的測試部分
}}
具體以上設計模式的框架可參考以下代碼(網上的代碼運行了,貼過來的):
import java.util.Iterator;
public class IterableString {//相當於圖中的arrayList的作用,一個容器,其中只有iterator()方法,沒有add,remove
private String orginString;
public IterableString(String orginString) {
super();
this.orginString = orginString;
}
public Iterator iterator() {
return new InnerIterator();
}
private class InnerIterator implements Iterator {//內部類實現iterator,重寫了hasNext和next方法。
private int index;
public boolean hasNext() {
return index < orginString.length();
}
public Object next() {
Character c = orginString.charAt(index);
index++;
return c;
}
public void remove() { }
}}
總結一下,理解起來有點繞,主要就是把hasNext,next拆到Iterator接口中,然後又要讓collection來實現這個藉口,這樣就導致一個容器要分兩個不同的層次實現他要用到的4個方法,add,remove直接在collection中實現iteartor()方法只是返回一個iteartor對象,對象調用自身的hasnext,next兩個方法實現遍歷。其中hasnext,next是iterator對象的方法屬性,在實現iterator的ArrayListIterator類中實現(通常用內部類)。
整理完成還是繞啊,雖然知道是怎麼回事,愁人。。。