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

迭代器模式的實現(xiàn):
Iterator類:
abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}
ConcreteIterator類:
//順序遍歷
class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate;
private int current = 0;
//將現(xiàn)在的數(shù)據(jù)組傳輸進來
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ù)進來
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類:
/// <summary>
/// 創(chuàng)建迭代器
/// 在這里看并沒有什么具體的用處
/// </summary>
abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
/// <summary>
/// 作用是保存數(shù)據(jù),保存的數(shù)據(jù)是一系列數(shù)據(jù),所以用數(shù)組
/// 然后傳輸數(shù)據(jù)給ConcreteIterator
/// </summary>
class ConcreteAggregate : Aggregate
{
//用于存放聚合對象
private IList<object> items = new List<object>();
public override Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
//數(shù)組的長度,也就是ConcreteAggregate的屬性
public int Count { get { return items.Count; } }
/// ConcreteAggregate現(xiàn)在是數(shù)組形式
/// get獲取當(dāng)前的數(shù)據(jù)
/// set將新來的數(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的迭代器實現(xiàn)
迭代器模式在我們現(xiàn)在的使用中其實沒有那么麻煩,因為.NET框架已經(jīng)準(zhǔn)備好了相關(guān)的接口,只需要實現(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");
//看見遍歷首先考慮foreach
foreach (string item in a)
{
Console.WriteLine("{0} buy ticket,please", item);
}
//支持在泛型集合上進行簡單迭代。
IEnumerator<string> e = a.GetEnumerator();
while (e.MoveNext())
{
Console.WriteLine("{0} buy ticket,please", e.Current);
}
Console.Read();
}
補充:IEnumerator

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

