在Java中提供有ArrayList類,您可以用它來設計一個動態的物件陣列,並在適當的時候取出陣列中的物
件,假設今天您要循序的訪問ArrayList中的所有物件,則您可能採取這樣的方式:
import java.util.*; 在這個例子中,很幸運的,您的ArrayList物件可以透過get()方法,使用索引加上迴圈的方式來循序訪問 ArrayList中的所有物件,不過並不是每一個聚合(aggregate)物件的內部實作都會是有索引結構的,也許是key/value的方式,或者 是其它的方式。 由於每個聚合物件的內部實作方式不盡相同,如果您想要循序的訪問聚合物件中所有的物件,您要為不同的聚合物件設計不同的循序訪問介面,然而 這並不是個好方法,結果是您設計的聚合物件上將會有很多的循序訪問方法,而使用您的聚合物件的人,還必須知道這個聚合物件的類型,才能進一步知道如何使用 它所提供的方法。 與其在聚合物件上直接設計遍訪的介面,不如設計一個介面Iterator,上面設計有統一的循序訪問,當您想要循序訪問聚合物件中的物件 時,將聚合物件中的物件加以包裝為一個Iterator後返回,客戶端只要面對Iterator所提供的介面,而不用面對為數眾多的聚合物件。 採取迭代器(Iterator)的方法,一個迭代器提供一個特定的遍訪方法,而使得設計人員無需關心聚合物件的類型(可能是ArrayList或 LinkedList等),例如上面這個程式可以改為:
import java.util.*; 如上所示的,iterator()方法會傳回一個Iterator物件,這個物件提供的循序訪問的統一介面,如果您查詢 Java API中的LinkedList所提供的方法,您會發現它的iterator()方法同樣也傳回Iterator物件,您無需關心您所使用的是 ArrayList或LinkedList,使用Iterator可以讓您以相同的方法來遍訪聚合物件的內容,以上例來說,visit()方法就可以重 用,它不特地服務於ArrayList或LinkedList。 ![]() 意這個模型是簡化過後的版本,並不是Java中的設計,這麼作只是為了方便說明,這個圖形說明了Iterator模式的基本結構。再來看另一個在 Thinking in Java的例子,可以說明使用Iterator的好處:
import java.util.*; 對於Printer物件來說,它完全不用知道聚合物件的類型到底是ArrayList或是LinkedList,您只要傳回Iterator物件就可以 了,剩下的就是使用Iterator物件所提供的循序訪問方法來訪問所有的物件。 Iterator模式的 UML 結構圖如下所示: ![]() 使用Iterator模式,可以將循序訪問聚合對象的方法從該對象中分離出來,從而使得聚合對象的設計單純化,對客戶來說,他所要知道的是所使用的 Iterator而不是聚合對象的類型。 |