C#學(xué)習(xí)筆記整理-迭代器模式介紹
什么是迭代器模式?
迭代器模式(Iterator):提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素,而又不暴露該對(duì)象的內(nèi)部表示。
何時(shí)使用迭代器模式?
當(dā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)自于《大話設(shè)計(jì)模式》,本人屬于邊學(xué)邊看邊敲代碼邊總結(jié)的階段。
以上這篇C#學(xué)習(xí)筆記整理-迭代器模式介紹就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#判斷指定驅(qū)動(dòng)器是否已經(jīng)準(zhǔn)備就緒的方法
這篇文章主要介紹了C#判斷指定驅(qū)動(dòng)器是否已經(jīng)準(zhǔn)備就緒的方法,涉及C#針對(duì)硬件IO操作的技巧,需要的朋友可以參考下2015-04-04
C#實(shí)現(xiàn)基于加減按鈕形式控制系統(tǒng)音量及靜音的方法
這篇文章主要介紹了C#實(shí)現(xiàn)基于加減按鈕形式控制系統(tǒng)音量及靜音的方法,涉及C#引用user32.dll動(dòng)態(tài)鏈接庫(kù)操作系統(tǒng)音量的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
c#根據(jù)文件大小顯示文件復(fù)制進(jìn)度條實(shí)例
這篇文章主要介紹了c#根據(jù)文件大小顯示文件復(fù)制進(jìn)度條實(shí)例,有需要的朋友可以參考一下2013-12-12
C#接口INotifyPropertyChanged使用方法
這篇文章介紹了C#接口INotifyPropertyChanged的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
C# OCR實(shí)現(xiàn)文字識(shí)別功能
OCR,中文叫做光學(xué)字符識(shí)別。它是利用光學(xué)技術(shù)和計(jì)算機(jī)技術(shù)把印在或?qū)懺诩埳系奈淖肿x取出來(lái),并轉(zhuǎn)換成一種計(jì)算機(jī)能夠接受、人又可以理解的格式。本文將利用OCR實(shí)現(xiàn)文字識(shí)別功能,感興趣的可以了解一下2022-11-11
C# WebService創(chuàng)建、發(fā)布、調(diào)用的實(shí)例講解
下面小編就為大家分享一篇C# WebService創(chuàng)建、發(fā)布、調(diào)用的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
winform實(shí)現(xiàn)拖動(dòng)文件到窗體上的方法
這篇文章主要介紹了winform實(shí)現(xiàn)拖動(dòng)文件到窗體上的方法,以實(shí)例分析了C#中WinForm操作窗體及文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
C#創(chuàng)建一個(gè)可快速重復(fù)使用的項(xiàng)目模板(詳細(xì)過(guò)程)
這篇文章主要介紹了C#如何創(chuàng)建一個(gè)可快速重復(fù)使用的項(xiàng)目模板今天給大家介紹的是基于官方的cli donet new 命令創(chuàng)建自己的項(xiàng)目模板,需要的朋友可以參考下2024-06-06
解析在內(nèi)部循環(huán)中Continue外部循環(huán)的使用詳解
本篇文章是對(duì)在內(nèi)部循環(huán)中Continue外部循環(huán)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
基于WPF手寫(xiě)一個(gè)簡(jiǎn)單的消息對(duì)話框
消息對(duì)話框是UI界面中不可或缺的組成部分,用于給用戶(hù)一些提示,警告或者詢(xún)問(wèn)的窗口,本文將使用WPF手寫(xiě)一個(gè)簡(jiǎn)單的消息對(duì)話框,感興趣的小伙伴可以了解下2023-12-12

