迭代器模式 Iterator Pattern

2021-09-08 14:34:15 字數 3394 閱讀 5347

動機(motivate):

在軟體構建過程中,集合物件內部結構常常變化各異。但對於這些集合物件,我們希望在不暴露其內部結構的同時,可以讓外部客戶**透明地訪問其中包含的元素;同時這種「透明遍歷」也為「 同一種演算法在多種集合物件上進行操作」提供了可能。

使用物件導向技術將這種遍歷機制抽象為「迭代器物件」為「應對變化中的集合物件」提供了一種優雅的方法。

意圖(intent):

提供一種方法順序訪問乙個聚合物件中各個元素, 而又不需暴露該物件的內部表示。-------《設計模式》gof

結構圖(struct):

適用性:  

1.訪問乙個聚合物件的內容而無需暴露它的內部表示。 2

.支援對聚合物件的多種遍歷。 3

.為遍歷不同的聚合結構提供乙個統一的介面(即, 支援多型迭代)。

生活中的例子:

迭代器提供一種方法順序訪問乙個集合物件中各個元素,而又不需要暴露該物件的內部表示。在早期的電視機中,乙個撥盤用來改變頻道。當改變頻道時,需要手工轉動撥盤移過每乙個頻道,而不論這個頻道是否有訊號。現在的電視機,使用[後乙個]和[前乙個]按鈕。當按下[後乙個]按鈕時,將切換到下乙個預置的頻道。想象一下在陌生的城市中的旅店中看電視。當改變頻道時,重要的不是幾頻道,而是節目內容。如果對乙個頻道的節目不感興趣,那麼可以換下乙個頻道,而不需要知道它是幾頻道。

**實現:

在物件導向 的軟體設計中,我們經常會遇到一類集合物件,這類集合物件的內部結構可能有著各種各樣的實現,但是歸結起來,無非有兩點是需要我們去關心的:一是集合內部 的資料儲存結構,二是遍歷集合內部的資料。物件導向設計原則中有一條是類的單一職責原則,所以我們要盡可能的去分解這些職責,用不同的類去承擔不同的職 責。iterator模式就是分離了集合物件的遍歷行為,抽象出乙個迭代器類來負責,這樣既可以做到不暴露集合的內部結構,又可讓外部**透明的訪問集合內部的資料。下面看乙個簡單的示意性例子,類結構圖如下:

首先有乙個抽象的聚集,所謂的聚集就是就是資料的集合,可以迴圈去訪問它。它只有乙個方法getiterator()讓子類去實現,用來獲得乙個迭代器物件。      

1///23

///抽象聚集45

/// 67

public

inte***ce

ilist89

抽象的迭代器,它是用來訪問聚集的類,封裝了一些方法,用來把聚集中的資料按順序讀取出來。通常會有movenext()、currentitem()、fisrt()、next()等幾個方法讓子類去實現。

1///23

///抽象迭代器45

/// 67

public

inte***ce

iiterator8

具體的聚集,它實現了抽象聚集中的唯一的方法,同時在裡面儲存了一組資料,這裡我們加上length屬性和getelement()方法是為了便於訪問聚集中的資料。

1///23

///具體聚集45

/// 67

public

class

concretelist : ilist8;

15}1617

public

iiterator getiterator()

1819

2223

public

intlength

242527}

2829

public

intgetelement(

intindex)

303134}

具體迭代器,實現了抽象迭代器中的四個方法,在它的建構函式中需要接受乙個具體聚集型別的引數,在這裡面我們可以根據實際的情況去編寫不同的迭代方式。

1/**/

///2

3///

具體迭代器45

/// 67

public

class

concreteiterator : iiterator89

2122

public

bool

movenext()

2324

3334

public

object currentitem()

3536

3940

public

void

first()

4142

4546

public

void

next()

474854}

55}簡單的客戶端程式呼叫:

1/**/

///2

3///

客戶端程式45

/// 67

class

program89

2728

console.read();

2930}31

32}.net中iterator中的應用:

在.net下實現iterator模式,對於聚集介面和迭代器介面已經存在了,其中ienumerator扮演的就是迭代器的角色,它的實現如下:

1public

inte***ce

ieumerator23

89bool

movenext();

1011

void

reset();

1213}

屬性current返回當前集合中的元素,reset()方法恢復初始化指向的位置,movenext()方法返回值true表示迭代器成功前進到集合中的下乙個元素,返回值false表示已經位於集合的末尾。能夠提供元素遍歷的集合物件,在.net中都實現了ienumerator介面。

ienumerable

則扮演的就是抽象聚集的角色,只有乙個getenumerator()方法,如果集合物件需要具備跌代遍歷的功能,就必須實現該介面。

1public

inte***ce

ienumerable23

iterator實現要點:

1.迭代抽象:訪問乙個聚合物件的內容而無需暴露它的內部表示。 2

.迭代多型:為遍歷不同的集合結構提供乙個統一的介面,從而支援同樣的演算法在不同的集合結構上進行操作。 3

.迭代器的健壯性考慮:遍歷的同時更改迭代器所在的集合結構,會導致問題。

迭代器模式

迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中各個元素,而不是暴露該物件的內部表示。乙個聚集物件,而且不管這些物件是什麼都需要遍歷的時候,你就應該考慮用迭代器模式。你需要對聚集有多種方式遍歷時,可以考慮用迭代器模式。為遍歷不同的聚集結構提供如開始,下乙個,是否結束,當前哪一項等統一...

迭代器模式

我最早接觸的設計模式就是迭代器模式了哈 為什麼要有迭代器模式呢?看下下面的 就知道了哈 對於乙個陣列物件sz 我們要怎麼遍歷呢?public void bianlisz class geweishu public myiterator getiterator private class geweis...

迭代器模式

迭代器模式 提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件多的內部表示。1 iterator抽象類 public abstract class iterator 2 aggregate聚集抽象類 public abstract class aggregate 3 concreteite...