設計模式Iterator

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類中實現(通常用內部類)。

整理完成還是繞啊,雖然知道是怎麼回事,愁人。。。

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