C#學(xué)習(xí)筆記整理-迭代器模式介紹
什么是迭代器模式?
迭代器模式(Iterator):提供一種方法順序訪(fǎng)問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素,而又不暴露該對(duì)象的內(nèi)部表示。
何時(shí)使用迭代器模式?
當(dāng)需要訪(fǎng)問(wèn)一個(gè)聚合對(duì)象,而且不管這些對(duì)象是什么都需要遍歷的時(shí)候,需要考慮使用迭代器模式。
迭代器模式的組成
Iterator:迭代器抽象類(lèi),用于定義得到開(kāi)始對(duì)象,對(duì)到下一個(gè)對(duì)象,判斷是否到結(jié)尾,當(dāng)前對(duì)象等抽象方法,統(tǒng)一接口。
ConcreteAggregate:保存聚合對(duì)象。
ConcreteIterator:繼承于Iterator,實(shí)現(xiàn)具體如何對(duì)聚合對(duì)象的操作。
迭代器模式具體實(shí)現(xiàn)
迭代器模式的結(jié)構(gòu)

迭代器模式的實(shí)現(xiàn):
Iterator類(lèi):
abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}
ConcreteIterator類(lèi):
//順序遍歷
class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate;
private int current = 0;
//將現(xiàn)在的數(shù)據(jù)組傳輸進(jìn)來(lái)
public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
}
public override object CurrentItem()
{
return aggregate[current];
}
public override object First()
{
return aggregate[0];
}
public override bool IsDone()
{
return current >= aggregate.Count ? true : false;
}
public override object Next()
{
object obj = null;
current++;
if (current < aggregate.Count)
{
obj = aggregate[current];
}
return obj;
}
}
//逆序遍歷
class ConcreteIteratorDesc : Iterator
{
private ConcreteAggregate aggregate;
private int current = 0;
//傳輸數(shù)據(jù)進(jìn)來(lái)
public ConcreteIteratorDesc(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
current = aggregate.Count - 1;
}
public override object CurrentItem()
{
return aggregate[current];
}
public override object First()
{
return aggregate[aggregate.Count - 1];
}
public override bool IsDone()
{
return current < 0 ? true:false;
}
public override object Next()
{
object obj = null;
current--;
if (current >= 0)
{
obj = aggregate[current];
}
return obj;
}
}
ConcreteAggregate類(lèi):
/// <summary>
/// 創(chuàng)建迭代器
/// 在這里看并沒(méi)有什么具體的用處
/// </summary>
abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
/// <summary>
/// 作用是保存數(shù)據(jù),保存的數(shù)據(jù)是一系列數(shù)據(jù),所以用數(shù)組
/// 然后傳輸數(shù)據(jù)給ConcreteIterator
/// </summary>
class ConcreteAggregate : Aggregate
{
//用于存放聚合對(duì)象
private IList<object> items = new List<object>();
public override Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
//數(shù)組的長(zhǎng)度,也就是ConcreteAggregate的屬性
public int Count { get { return items.Count; } }
/// ConcreteAggregate現(xiàn)在是數(shù)組形式
/// get獲取當(dāng)前的數(shù)據(jù)
/// set將新來(lái)的數(shù)據(jù)插入到ConcreteAggregate中
public object this[int index]
{
get { return items[index]; }
set { items.Insert(index, value); }
}
}
主函數(shù)調(diào)用:
static void Main(string[] args)
{
ConcreteAggregate a = new ConcreteAggregate();
a[0] = "A";
a[1] = "B";
a[2] = "C";
a[3] = "D";
a[4] = "E";
a[5] = "F";
Iterator i = new ConcreteIterator(a);
object item = i.First();
while (!i.IsDone())
{
Console.WriteLine("{0} buy ticket,please", i.CurrentItem());
i.Next();
}
Iterator id = new ConcreteIteratorDesc(a);
object itemdec = id.First();
while (!id.IsDone())
{
Console.WriteLine("{0} buy ticket,please", id.CurrentItem());
id.Next();
}
Console.Read();
}
.NET的迭代器實(shí)現(xiàn)
迭代器模式在我們現(xiàn)在的使用中其實(shí)沒(méi)有那么麻煩,因?yàn)?NET框架已經(jīng)準(zhǔn)備好了相關(guān)的接口,只需要實(shí)現(xiàn)就好了。
static void Main(string[] args)
{
IList<string> a = new List<string>();
a.Add("A");
a.Add("B");
a.Add("C");
a.Add("D");
a.Add("E");
a.Add("F");
//看見(jiàn)遍歷首先考慮foreach
foreach (string item in a)
{
Console.WriteLine("{0} buy ticket,please", item);
}
//支持在泛型集合上進(jìn)行簡(jiǎn)單迭代。
IEnumerator<string> e = a.GetEnumerator();
while (e.MoveNext())
{
Console.WriteLine("{0} buy ticket,please", e.Current);
}
Console.Read();
}
補(bǔ)充:IEnumerator

備注:文中所有代碼及知識(shí)點(diǎn)均來(lái)自于《大話(huà)設(shè)計(jì)模式》,本人屬于邊學(xué)邊看邊敲代碼邊總結(jié)的階段。
以上這篇C#學(xué)習(xí)筆記整理-迭代器模式介紹就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C# 多線(xiàn)程編程技術(shù)基礎(chǔ)知識(shí)入門(mén)
這篇文章主要介紹了C# 多線(xiàn)程編程技術(shù)基礎(chǔ)知識(shí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
C#?wpf?通過(guò)HwndHost渲染視頻的實(shí)現(xiàn)方法
日常開(kāi)發(fā)中,特別是音視頻開(kāi)發(fā),需要在界面上渲染視頻,比如制作一個(gè)播放器、或者視頻編輯工具、以及視頻會(huì)議客戶(hù)端。通常拿到的是像素格式數(shù)據(jù),此時(shí)需要渲染到wpf窗口上就需要一定的方法,本文介紹一種通過(guò)hwnd渲染的方法,控件既能提供hwnd又能嵌入wpf窗口里2021-11-11
C#設(shè)置自定義文件圖標(biāo)實(shí)現(xiàn)雙擊啟動(dòng)(修改注冊(cè)表)
這篇文章介紹的是利用C#設(shè)置自定義文件圖標(biāo),然后實(shí)現(xiàn)雙擊啟動(dòng)的功能,文章給出了示例代碼,介紹的很詳細(xì),有需要的可以參考借鑒。2016-08-08

