日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

初涉c#设计模式-Iterator Pattern

發(fā)布時(shí)間:2025/3/8 C# 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初涉c#设计模式-Iterator Pattern 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、迭代器模式簡(jiǎn)介(Brief Introduction)

  迭代器模式(Iterator Pattern),提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中元素,而不暴露改集合對(duì)象的內(nèi)部表示。

  Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

二、解決的問(wèn)題(What To Solve)

????? 在軟件構(gòu)建過(guò)程中,集合對(duì)象內(nèi)部結(jié)構(gòu)常常變化各異。但對(duì)于這些集合對(duì)象,我們希望在不暴露其內(nèi)部結(jié)構(gòu)的同時(shí),可以讓外部客戶代碼透明地訪問(wèn)其中包含的元素;同時(shí)這種“透明遍歷”也為“同一種算法在多種集合對(duì)象上進(jìn)行操作”提供了可能。

  當(dāng)需要訪問(wèn)一個(gè)聚集對(duì)象,而且不管這些對(duì)象是什么都需要遍歷的時(shí)候,應(yīng)該考慮用迭代器模式;當(dāng)需要對(duì)聚集有多種方式遍歷時(shí),可以考慮使用迭代器模式。其中,你不用關(guān)心到底是什么樣子的數(shù)組作為對(duì)象集合,是Array,是List還是簡(jiǎn)單的數(shù)組,迭代器模式會(huì)提供給你一個(gè)聚合對(duì)象的遍歷方式,而不用去了解具體是在遍歷什么類(lèi)型的聚合對(duì)象。

三、代碼:

View Code using System; using System.Collections.Generic; using System.Text;namespace IteratePattern {public class Guest{public string id{get;set;}public string name{get;set;}public Guest(string aId, string aName){id = aId;name = aName;}}public interface IAggrate{IIterator GetIterator();}public class ConcreateAggrate:IAggrate{List<object> _guest = new List<object>();public IIterator GetIterator(){return new ConcreateIterator(this);}public object this[int index]{get{return _guest[index];}set{_guest.Add(value);}}public int count(){return _guest.Count;}}public interface IIterator{bool Next();}class ConcreateIterator : IIterator{ConcreateAggrate _aggrate;int currentindex;public ConcreateIterator(ConcreateAggrate aAggrate){_aggrate = aAggrate;currentindex = -1;}public object Current{get { return _aggrate[currentindex]; }}public bool Next(){currentindex++;return _aggrate.count() > currentindex;}}class Program{static void Main(string[] args){ConcreateAggrate aAggrate = new ConcreateAggrate();aAggrate[0] = new Guest("1", "hi");aAggrate[1] = new Guest("2", "my");aAggrate[2] = new Guest("3", "dear");aAggrate[3] = new Guest("4", "iterator");aAggrate[4] = new Guest("5", "pattern");//ConcreateIterator aIterator = new ConcreateIterator(aAggrate);ConcreateIterator aIterator = (ConcreateIterator)aAggrate.GetIterator();while (aIterator.Next())Console.WriteLine(((Guest)aIterator.Current).name);}} }

?

舉例Iterator應(yīng)用

  下面是迭代器所擁有的最小集合,Current是屬性,只能Get不能Set。還有兩個(gè)方法:MoveNext是往下一個(gè)元素走,如果訪問(wèn)到最后一個(gè)元素之后沒(méi)有元素了,就返回False;Reset是復(fù)位,回到初始位置。

  如果有一個(gè)容器實(shí)現(xiàn)了IEnumerable接口,它就可以支持我們的迭代操作了。這種設(shè)計(jì)模式已經(jīng)內(nèi)化為C#語(yǔ)言的一種元素了,就是Foreach關(guān)鍵字。我們定義的容器首先要實(shí)現(xiàn)IEnumerable接口,實(shí)現(xiàn)的GetEnumerator方法要返回一個(gè)IEnumerator的類(lèi)型的集合。

View Code using System; using System.Collections.Generic; using System.Text; using System.Collections;namespace IteratePattern {public class Guest{public string id{get;set;}public string name{get;set;}public Guest(string aId, string aName){id = aId;name = aName;}}public class ConcreateAggrate:IEnumerable{List<object> _guest = new List<object>();public object this[int index]{get{return _guest[index];}set{_guest.Add(value);}}public int count(){return _guest.Count;}#region IEnumerable 成員IEnumerator IEnumerable.GetEnumerator(){return new ConcreateIterator(this);}#endregion}class ConcreateIterator : IEnumerator{ConcreateAggrate _aggrate;int currentindex;public ConcreateIterator(ConcreateAggrate aAggrate){_aggrate = aAggrate;currentindex = -1;}#region IEnumerator 成員object IEnumerator.Current{get { return _aggrate[currentindex]; }}bool IEnumerator.MoveNext(){currentindex++;return _aggrate.count() > currentindex;}void IEnumerator.Reset(){currentindex = -1;}#endregion}class Program{static void Main(string[] args){ConcreateAggrate aAggrate = new ConcreateAggrate();aAggrate[0] = new Guest("1", "hi");aAggrate[1] = new Guest("2", "my");aAggrate[2] = new Guest("3", "dear");aAggrate[3] = new Guest("4", "iterator");aAggrate[4] = new Guest("5", "pattern");foreach (Guest aGuest in aAggrate)Console.WriteLine(aGuest.name);}} }

?

  Foreach的工作機(jī)制

IEnumerator ietor = aAggrate.GetEnumerator();while(ietor.MoveNext()){Guest aGuest = (Guest)ietor.Current;Console.WriteLine(aGuest);}

?

?

遍歷代碼中訪問(wèn)的全部是接口,而不用關(guān)心集合的內(nèi)部結(jié)構(gòu)。上面的代碼等同于下面的Foreach。

結(jié)構(gòu)(Structure)

?

Iterator模式的幾個(gè)要點(diǎn)

  迭代抽象:訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)需暴露它的內(nèi)部表示。迭代多態(tài):為遍歷不同的集合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進(jìn)行操作。例如假設(shè)我們有一個(gè)求和算法

  它可以操作在多個(gè)支持迭代器的集合上,如果把這個(gè)算法寫(xiě)成ArrayList的話,就會(huì)非常受限制。同時(shí)我們更可以用C#的Foreach語(yǔ)句來(lái)寫(xiě)。

  我們的算法應(yīng)該是獨(dú)立的,寫(xiě)的時(shí)候應(yīng)該盡量操作接口,這樣我們寫(xiě)好一個(gè)算法,就能應(yīng)對(duì)N種集合的變化,使得同樣的算法能在不同的集合上操作。迭代器的健壯性考慮:遍歷的同時(shí)更改迭代器所在的集合結(jié)構(gòu),會(huì)導(dǎo)致問(wèn)題。也就是說(shuō),我們?cè)诘臅r(shí)候,應(yīng)該只是讀取操作,不能更改容器的接口,例如遍歷的時(shí)候刪除一個(gè)元素,這樣是不可以的。容器的結(jié)構(gòu)師絕對(duì)不能碰的,一旦結(jié)構(gòu)更改,遍歷就會(huì)出問(wèn)題。

  下面這種情況對(duì)i進(jìn)行更改,是不會(huì)影響原來(lái)的數(shù)組內(nèi)容的,因?yàn)閕是int類(lèi)型,它只是一份拷貝。

  我們一定要給用戶提供盡量純只讀的迭代。保證每個(gè)元素被且只被遍歷一次。

(引自:山天大畜博客園,http://www.cnblogs.com/cdts_change/archive/2010/10/17/1853689.html)

總結(jié)(Conclusion)

從上面的幾個(gè)示例中就可以看出,盡管我們沒(méi)有顯示的引用迭代器,但實(shí)質(zhì)還是通過(guò)迭代器來(lái)遍歷的。總地來(lái)說(shuō),迭代器模式就是分離了集合對(duì)象的迭代行為,抽象出一個(gè)迭代器類(lèi)來(lái)負(fù)責(zé),這樣既可做到不暴露集合的內(nèi)部結(jié)構(gòu),又可以讓外部代碼可以透明的訪問(wèn)集合內(nèi)部的元素。

  迭代器模式在訪問(wèn)數(shù)組、集合、列表等數(shù)據(jù)時(shí),尤其是數(shù)據(jù)庫(kù)數(shù)據(jù)操作時(shí),是非常普遍的應(yīng)用,但由于它太普遍了,所以各種高級(jí)語(yǔ)言都對(duì)他進(jìn)行了封裝,所以反而給人感覺(jué)此模式本身不太常用了。

?

轉(zhuǎn)載請(qǐng)注明出處:Edward_jie,http://www.cnblogs.com/promise-7/archive/2012/05/28/2521918.html

總結(jié)

以上是生活随笔為你收集整理的初涉c#设计模式-Iterator Pattern的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。