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)準備好了相關(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#判斷指定驅(qū)動器是否已經(jīng)準備就緒的方法
這篇文章主要介紹了C#判斷指定驅(qū)動器是否已經(jīng)準備就緒的方法,涉及C#針對硬件IO操作的技巧,需要的朋友可以參考下2015-04-04C#實現(xiàn)基于加減按鈕形式控制系統(tǒng)音量及靜音的方法
這篇文章主要介紹了C#實現(xiàn)基于加減按鈕形式控制系統(tǒng)音量及靜音的方法,涉及C#引用user32.dll動態(tài)鏈接庫操作系統(tǒng)音量的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10C#接口INotifyPropertyChanged使用方法
這篇文章介紹了C#接口INotifyPropertyChanged的使用方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01C# WebService創(chuàng)建、發(fā)布、調(diào)用的實例講解
下面小編就為大家分享一篇C# WebService創(chuàng)建、發(fā)布、調(diào)用的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12C#創(chuàng)建一個可快速重復(fù)使用的項目模板(詳細過程)
這篇文章主要介紹了C#如何創(chuàng)建一個可快速重復(fù)使用的項目模板今天給大家介紹的是基于官方的cli donet new 命令創(chuàng)建自己的項目模板,需要的朋友可以參考下2024-06-06解析在內(nèi)部循環(huán)中Continue外部循環(huán)的使用詳解
本篇文章是對在內(nèi)部循環(huán)中Continue外部循環(huán)的使用進行了詳細的分析介紹,需要的朋友參考下2013-05-05