迭代器模式 Iterator Pattern

2021-10-09 10:55:12 字數 2371 閱讀 4540

動機(motivate):

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

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

意圖(intent):

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

結構圖(struct):

適用性:

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

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

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

**實現:

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

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

/// /// 抽象聚集

///

public inte***ce ilist

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

/// /// 抽象迭代器

///

public inte***ce iiterator

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

/// /// 具體聚集

///

public class concretelist : ilist

; }

public iiterator getiterator()

public int length

}public int getelement(int index)

}

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

/** /// 具體迭代器

///

public class concreteiterator : iiterator

public bool movenext()

public object currentitem()

public void first()

public void next()}}

簡單的客戶端程式呼叫:

/** /// 客戶端程式

///

class program

console.read();}}

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

public inte***ce ieumerator

bool movenext();

void reset();

}

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

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

public inte***ce ienumerable

迭代器模式

迭代器模式 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...