動機(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...