.Net行為型設(shè)計模式之迭代器模式(Iterator)
一、動機(Motivate)
在軟件構(gòu)建過程中,集合對象內(nèi)部結(jié)構(gòu)常常變化各異。但對于這些集合對象,我們希望在不暴露其內(nèi)部結(jié)構(gòu)的同時,可以讓外部客戶代碼透明地訪問其中包含的元素;同時這種“透明遍歷”也為“同一種算法在多種集合對象上進行操作”提供了可能。
使用面向?qū)ο蠹夹g(shù)將這種遍歷機制抽象為“迭代器對象”為“應(yīng)對變化中的集合對象”提供了一種優(yōu)雅的方式。
二、意圖(Intent)
提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露該對象的內(nèi)部表示。 ——《設(shè)計模式》GoF
三、結(jié)構(gòu)圖

四、模式的組成
從迭代器模式的結(jié)構(gòu)圖可以看出,它涉及到四個角色,它們分別是:
(1)、抽象迭代器(Iterator):抽象迭代器定義了訪問和遍歷元素的接口,一般聲明如下方法:用于獲取第一個元素的first(),用于訪問下一個元素的next(),用于判斷是否還有下一個元素的hasNext(),用于獲取當(dāng)前元素的currentItem(),在其子類中將實現(xiàn)這些方法。
(2)、具體迭代器(ConcreteIterator):具體迭代器實現(xiàn)了抽象迭代器接口,完成對集合對象的遍歷,同時在對聚合進行遍歷時跟蹤其當(dāng)前位置。
(3)、抽象聚合類(Aggregate):抽象聚合類用于存儲對象,并定義創(chuàng)建相應(yīng)迭代器對象的接口,聲明一個createIterator()方法用于創(chuàng)建一個迭代器對象。
(4)、具體聚合類(ConcreteAggregate):具體聚合類實現(xiàn)了創(chuàng)建相應(yīng)迭代器的接口,實現(xiàn)了在抽象聚合類中聲明的createIterator()方法,并返回一個與該具體聚合相對應(yīng)的具體迭代器ConcreteIterator實例。
五、迭代器模式的代碼實現(xiàn)
迭代器模式在現(xiàn)實生活中也有類似的例子,比如:在部隊中,我們可以讓某一隊伍當(dāng)中的某人出列,或者讓隊列里面的每個人依次報名,其實這個過程就是一個遍歷的過程。
// 客戶端(Client)
static void Main(string[] args)
{
Iterator iterator;
ITroopQueue list = new ConcreteTroopQueue();
iterator = list.GetIterator();
while (iterator.MoveNext())
{
string ren = (string)iterator.GetCurrent();
Console.WriteLine(ren);
iterator.Next();
}
Console.Read();
}
// 部隊隊列的抽象聚合類--該類型相當(dāng)于抽象聚合類Aggregate
public interface ITroopQueue
{
Iterator GetIterator();
}
// 迭代器抽象類
public interface Iterator
{
bool MoveNext();
Object GetCurrent();
void Next();
void Reset();
}
//部隊隊列具體聚合類--相當(dāng)于具體聚合類ConcreteAggregate
public sealed class ConcreteTroopQueue : ITroopQueue
{
private string[] collection;
public ConcreteTroopQueue()
{
collection = new string[] { "黃飛鴻", "方世玉", "洪熙官", "嚴(yán)詠春" };
}
public Iterator GetIterator()
{
return new ConcreteIterator(this);
}
public int Length
{
get { return collection.Length; }
}
public string GetElement(int index)
{
return collection[index];
}
}
// 具體迭代器類
public sealed class ConcreteIterator : Iterator
{
// 迭代器要集合對象進行遍歷操作,自然就需要引用集合對象
private ConcreteTroopQueue _list;
private int _index;
public ConcreteIterator(ConcreteTroopQueue list)
{
_list = list;
_index = 0;
}
public bool MoveNext()
{
if (_index < _list.Length)
{
return true;
}
return false;
}
public Object GetCurrent()
{
return _list.GetElement(_index);
}
public void Reset()
{
_index = 0;
}
public void Next()
{
if (_index < _list.Length)
{
_index++;
}
}
}六、迭代器模式的實現(xiàn)要點:
1、迭代抽象:訪問一個聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示。
2、迭代多態(tài):為遍歷不同的集合結(jié)構(gòu)提供一個統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進行操作。
3、迭代器的健壯性考慮:遍歷的同時更改迭代器所在的集合結(jié)構(gòu),會導(dǎo)致問題。
迭代器模式的優(yōu)點:
(1)、迭代器模式使得訪問一個聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示,即迭代抽象。
(2)、迭代器模式為遍歷不同的集合結(jié)構(gòu)提供了一個統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進行操作。
迭代器模式的缺點:
迭代器模式在遍歷的同時更改迭代器所在的集合結(jié)構(gòu)會導(dǎo)致出現(xiàn)異常。所以使用foreach語句只能在對集合進行遍歷,不能在遍歷的同時更改集合中的元素。
迭代器模式的使用場景:
(1)、訪問一個聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示。
(2)、支持對聚合對象的多種遍歷。
(3)、為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的接口(即, 支持多態(tài)迭代)。
七、.NET 中迭代器模式的實現(xiàn)
在mscorlib程序集里有這樣一個命名空間,該命名空間就是:System.Collections,在該命名空間里面早已有了迭代器模式的實現(xiàn)。對于聚集接口和迭代器接口已經(jīng)存在了,其中IEnumerator扮演的就是迭代器的角色,它的實現(xiàn)如下:
public interface IEnumerator
{
object Current
{
get;
}
bool MoveNext();
void Reset();
}屬性Current返回當(dāng)前集合中的元素,Reset()方法恢復(fù)初始化指向的位置,MoveNext()方法返回值true表示迭代器成功前進到集合中的下一個元素,返回值false表示已經(jīng)位于集合的末尾。能夠提供元素遍歷的集合對象,在.Net中都實現(xiàn)了IEnumerator接口。
IEnumerable則扮演的就是抽象聚集的角色,只有一個GetEnumerator()方法,如果集合對象需要具備跌代遍歷的功能,就必須實現(xiàn)該接口。
public interface IEnumerable
{
IEumerator GetEnumerator();
}抽象聚合角色(Aggregate)和抽象迭代器角色(Iterator)分別是IEnumerable接口和IEnumerator接口,具體聚合角色(ConcreteAggregate)有Queue類型, BitArray等類型。
到此這篇關(guān)于.Net行為型設(shè)計模式之迭代器模式(Iterator)的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- .Net行為型設(shè)計模式之備忘錄模式(Memento)
- .Net行為型設(shè)計模式之訪問者模式(Visitor)
- .Net行為型設(shè)計模式之職責(zé)鏈模式(Chain of Responsibility)
- .Net行為型設(shè)計模式之策略模式(Stragety)
- .Net行為型設(shè)計模式之狀態(tài)模式(State)
- .Net行為型設(shè)計模式之中介者模式(Mediator)
- .Net行為型設(shè)計模式之觀察者模式(Observer)
- .Net行為型設(shè)計模式之命令模式(Command)
- .Net行為型設(shè)計模式之模板方法模式(Template?Method)
- .Net行為型設(shè)計模式之解釋器模式(Interpreter)
相關(guān)文章
.NET?6全新配置對象ConfigurationManager介紹
這篇文章介紹了.NET?6全新配置對象ConfigurationManager,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11
.Net結(jié)構(gòu)型設(shè)計模式之橋接模式(Bridge)
這篇文章介紹了.Net結(jié)構(gòu)型設(shè)計模式之橋接模式(Bridge),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
ASP.NET Core MVC中的控制器(Controller)介紹
這篇文章介紹了ASP.NET Core MVC中的控制器(Controller),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04

