您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“C#中迭代器模式的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C#中迭代器模式的示例分析”這篇文章吧。
什么是迭代器模式?
迭代器模式(Iterator):提供一種方法順序訪問一個(gè)聚合對(duì)象中各個(gè)元素,而又不暴露該對(duì)象的內(nèi)部表示。
何時(shí)使用迭代器模式?
當(dāng)需要訪問一個(gè)聚合對(duì)象,而且不管這些對(duì)象是什么都需要遍歷的時(shí)候,需要考慮使用迭代器模式。
迭代器模式的組成
Iterator:迭代器抽象類,用于定義得到開始對(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類:
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ù)組傳輸進(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類:
/// <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 { //用于存放聚合對(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í)沒有那么麻煩,因?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"); //看見遍歷首先考慮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#中迭代器模式的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。