設計模式 Iterator 迭代器 模式

2021-10-01 22:28:51 字數 2803 閱讀 1828

​ 試想一下,我們在獲取乙個陣列中的元素時,一般會使用for迴圈語句遍歷陣列,i++的作用是讓 i 的值在每次迴圈後自增1,這樣就可以依次訪問陣列中的下乙個元素,也就實現了從頭至尾逐一遍歷陣列元素的功能。

for

(int i =

0; i < arr.length;i++

)

​ 將 i 的作用抽象化,通用化後形成的模式,就稱為iterator模式。iterator模式用於在資料集合中按照順序遍歷集合。

​ 來想乙個簡單的問題,假如有一些書本,這些書本需要放在書架中,這樣我們就可以很方便的管理這些書,現在需要將書架上的書的名字按順序顯示出來,用iterator模式來實現。

aggregate介面

​ 這裡把所有類似書架(bookshelf)這樣的,用於存放物品的容器抽象出乙個aggregate介面,裡面只有乙個獲取iterator的方法,書架(bookshelf)需要實現這個介面。

public

inte***ce

aggregate

iterator介面

​ iterator介面用來遍歷集合中的元素,其中有判斷是否存在下乙個元素的hasnext方法,和獲取下乙個元素的next方法。

public

inte***ce

iterator

book類

​ book類用來表示書本,它在這裡比較簡單,裡面只有乙個獲取名字的方法。

public

class

book

public string getname()

}

bookshelf類

​ bookshelf類用來表示書架,因為它是乙個容器,所以要求實現aggregate介面。這裡實現了aggregate介面的iterator方法,該方法會生成並返回乙個bookshelfiterator類的例項,當外部想要遍歷書架時,就會呼叫這個方法。

public

class

bookshelf

implements

aggregate

public book getbookat

(int index)

public

void

(book book)

public

intgetlength()

@override

public iterator iterator()

}

bookshelfiterator類

​ bookshelfiterator類用來表示遍歷書架的類,它實現了iterator類。bookshelf欄位表示bookshelfiterator所要遍歷的書架。index欄位表示迭代器當前所指向的書的下標。

public

class

bookshelfiterator

implements

iterator

@override

public

boolean

hasnext()

@override

public object next()

}

main類
public

class

main

}}

iterator(迭代器)
​ 該角色負責定義按順序逐個遍歷元素的介面(api)。在示例程式中,由iterator介面扮演這個角色,他定義了hasnext和 next兩個方法。其中,hasnext方法用於判斷是否存在下乙個元素,next方法則用於獲取該元素。

concreteiterator(具體的迭代器)
​ 該角色負責實現iterator角色所定義的介面(api)。在示例程式中,bookshelfiterator 類扮演這個角色。該角色中包含了遍歷集合所必需的資訊。在示例程式中 bookshelf 類的例項儲存在 bookshelf 欄位中,被指向的書的下標儲存在 index 欄位中。

aggregate(集合)
​ 該角色負責定義建立 iterator 角色的介面(api)。這個介面是乙個方法,會建立出「按順序訪問儲存在我內部元素的人」。在示例程式中,由aggregate 介面扮演這個角色,它裡面定義了 iterator 方法。

concreteaggregate(具體的集合)
​ 該角色負責實現 aggregate 角色所定義的介面(api)。它會建立出具體的 iterator角色,即 concreteiterator 。在示例程式中,由bookshelf 類扮演這個角色,它實現了iterator 方法。

​ 為什麼一定要考慮使用這種複雜的設計模式呢,如果是陣列,直接用迴圈語句遍歷處理不是更方便嗎。乙個很重要的方面就是這樣可以將遍歷與具體的實現分開,在上面的**中,遍歷書籍的時候,我們並沒有呼叫書架(bookshelf)的方法,也就是說,while迴圈並沒有依賴於書架(bookshelf)的實現,如果現在需要用其他容器的例如箱子(arraylist)來裝書,那麼只要箱子(arraylist)的iterator方法可以正確的返回iterator例項,就算不對while迴圈做任何處理,**也可以正常工作,這在**的維護工作中是非常重要的。

​ 設計模式的作用就是幫助我們編寫可復用的**,所謂可復用,就是指將類實現作為元件,當乙個元件發生改變時,不需要對其他的元件進行修改或是只需要很小的修改即可應對。

注:參考自**設計模式

設計模式 迭代器模式(Iterator)

顧名思義,迭代器模式就是順序訪問集合中的物件,一般來說,集合中非常常見,如果對集合模擬較熟悉的話,理解本模式會十分輕鬆。這句話包含兩層意思 一是需要遍歷的物件,即聚集物件,二是迭代器物件,用於對聚集物件進行遍歷訪問。我們看下關係圖 這個思路和我們常用的一模一樣,mycollection中定義了集合的...

設計模式 迭代器模式(Iterator)

迭代器 在各種語言中 都有封裝好的迭代器集合 比如c list 迭代器圖 舉例子電視和遙控器 電視如果沒有遙控器 需要去電視控制面板 乙個乙個的換台 有遙控器就可以 在遙控器裡直接按鍵 用來很方便 很解耦 iterator 乙個實體類 集合需要的物件 倆個介面 乙個是集合物件介面 包含建立操作集合方...

設計模式 迭代器模式 Iterator

迭代器模式就是順序訪問聚集中的物件,一般來說,集合中非常常見,如果對集合模擬較熟悉的話,理解本模式會十分輕鬆。這句話包含兩層意思 一是需要遍歷的物件,即聚集物件,二是迭代器物件,用於對聚集物件進行遍歷訪問 訪問乙個聚合物件的內容而無需暴露它的內部表示。支援對聚合物件的多種遍歷。為遍歷不同的聚合結構提...