C#迭代器模式(Iterator Pattern)實(shí)例教程
本文以實(shí)例形式簡(jiǎn)單簡(jiǎn)述了C#迭代器模式的實(shí)現(xiàn)方法,分享給大家供大家參考。具體方法如下:
一般來說,迭代器模式的需求來自:需要對(duì)一些集合進(jìn)行迭代,而迭代的方式可能有很多種。
說到迭代,動(dòng)作大致包括設(shè)置第一個(gè)位置,獲取下一個(gè)位置元素,判斷是否迭代結(jié)束,獲取當(dāng)前位置元素,大致就這么些。把這些迭代動(dòng)作封裝到一個(gè)接口中。
public interface IIterator { void First(); string Next(); bool IsDone(); string Current(); }
在現(xiàn)實(shí)場(chǎng)景中,迭代的方式可能有很多種,先實(shí)現(xiàn)一種迭代方式,實(shí)現(xiàn)IIterator接口。
public class IWannaIterate : IIterator { private List<string> _list; private int position; public IWannaIterate(List<string> list) { Console.WriteLine("我要感謝IIterator,有了它我才可以迭代"); _list = list; position = 0; } public void First() { position = 0; } public string Next() { return _list[position++]; } public bool IsDone() { return position >= _list.Count; } public string Current() { return _list[position]; } }
以上,迭代器IWannaIterate類內(nèi)部維護(hù)這一個(gè)集合,而這個(gè)集合是通過構(gòu)造函數(shù)賦值的,否則的話,迭代器就沒活干了。
好了,迭代器,迭代的具體方式有了,迭代器給誰用呢?
只要一個(gè)類維護(hù)著集合,就可能用到以上實(shí)現(xiàn)IIterator接口的某種具體迭代器。所有需要迭代器的類都有一個(gè)共同的動(dòng)作,就是創(chuàng)建一個(gè)迭代器。先把創(chuàng)建迭代器的動(dòng)作抽象成接口。
public interface IManagement { IIterator CreateIterator(); }
假設(shè)有一個(gè)管理用戶集合的類,使用以上的IWannaIterate迭代器。
public class MyUserManagement : IManagement { private List<string> _users; public MyUserManagement() { _users = new List<string>(); _users.Add("hello"); _users.Add("world"); _users.Add("nice"); } public IIterator CreateIterator() { return new IWannaIterate(_users); } }
假設(shè)有一個(gè)管理Book集合的類,也使用以上的IWannaIterate迭代器。
public class MyBookManagement : IManagement { private List<string> _books; public MyBookManagement() { _books = new List<string>(); _books.Add("美麗世界"); _books.Add("你好嗎"); } public IIterator CreateIterator() { return new IWannaIterate(_books); } }
客戶端讓MyUserManagement和MyBookManagement創(chuàng)建各自的迭代器,然后使用迭代器把集合的所有元素打印出來。
class Program { static void Main(string[] args) { IManagement magageA = new MyUserManagement(); IManagement manageB = new MyBookManagement(); IIterator iteratorA = magageA.CreateIterator(); IIterator iteratorB = manageB.CreateIterator(); Console.WriteLine("打印出的user列表"); PrintList(iteratorA); Console.WriteLine(); Console.WriteLine("打印出book列表"); PrintList(iteratorB); Console.ReadKey(); } private static void PrintList(IIterator iterator) { while (!iterator.IsDone()) { Console.WriteLine(iterator.Next()); } } }
運(yùn)行結(jié)果如下圖所示:
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
js substr,substring與java substring和C# substring的區(qū)別解析
本篇文章主要是對(duì)js中substr,substring與java中substring和C#中substring的區(qū)別進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01C#使用CryptoStream類加密和解密字符串的實(shí)現(xiàn)
CryptoStream設(shè)計(jì)用于在內(nèi)容以流的形式輸出到文件時(shí)加密和解密內(nèi)容,本文主要介紹了C#使用CryptoStream類加密和解密字符串的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01