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

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

生活随笔

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

asp.net

设计模式之迭代器

發(fā)布時(shí)間:2023/12/4 asp.net 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之迭代器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

迭代器模式介紹

集合的結(jié)構(gòu)

迭代器模式是一種行為設(shè)計(jì)模式,讓你能在不暴露集合底層表現(xiàn)形式(列表、棧、樹等)的情況下遍歷集合中所有的元素。

迭代器模式滿足了單一職責(zé)和開閉原則,外界的調(diào)用方也不需要知道任何一個(gè)不同的數(shù)據(jù)結(jié)構(gòu)在使用上的遍歷差異。

迭代器模式的主要思想是將集合的遍歷行為抽取為單獨(dú)的迭代器對(duì)象。

除實(shí)現(xiàn)自身算法外,迭代器還封裝了遍歷操作的所有細(xì)節(jié),比如當(dāng)前位置和末尾剩余元素的數(shù)量、同時(shí)還有提供一個(gè)獲取集合元素的基本方法。客戶端可不斷調(diào)用該方法直到它不返回任何內(nèi)容(已遍歷所有元素)、所有迭代器必須實(shí)現(xiàn)相同的接口(只要有合適的迭代器,客戶端代碼就能兼容任何類型的集合或遍歷算法)。

迭代器的結(jié)構(gòu)

  • 迭代器接口:聲明了遍歷集合所需的操作。(獲取下一個(gè)元素,獲取當(dāng)前位置和重新開始迭代等)

  • 具體迭代者:實(shí)現(xiàn)遍歷集合的一種特定算法。(迭代器必須跟蹤自身遍歷的進(jìn)度)

  • 集合接口:聲明一個(gè)或多個(gè)方法來(lái)獲取與集合兼容的迭代器。(返回方法的類型必須被聲明為迭代器接口,因此具體集合可以返回各種不同種類的迭代器)

  • 具體集合:會(huì)在客戶端請(qǐng)求迭代器時(shí)返回一個(gè)特定的具體迭代器類。

  • 客戶端:通過(guò)集合和迭代器的接口與兩者進(jìn)行交互。這樣一來(lái)客戶端無(wú)需與具體類進(jìn)行耦合,允許同一客戶端代碼使用各種不同的集合和迭代器。

應(yīng)用場(chǎng)景

  • 當(dāng)集合背后為復(fù)雜的數(shù)據(jù)結(jié)構(gòu),且你希望對(duì)客戶端隱藏其復(fù)雜性時(shí)。

  • 想避免程序中重復(fù)的遍歷代碼

  • 程序代碼能夠遍歷不同的甚至是無(wú)法預(yù)知的數(shù)據(jù)結(jié)構(gòu)時(shí)。

實(shí)現(xiàn)方式

1、聲明迭代器接口

2、聲明集合接口并描述一個(gè)獲取迭代器的方法,其返回值必須是迭代器接口。

3、為希望使用迭代器遍歷的集合實(shí)現(xiàn)具體的迭代器類。

4、在你的集合類中實(shí)現(xiàn)集合接口。

5、在客戶端使用迭代器替代所有集合遍歷代碼。

Demo

在迭代器的幫助下,客戶端可以用一個(gè)迭代器接口以相似的方式遍歷不同集合中的元素。

迭代器模式的辨別

  • 迭代器可以通過(guò)導(dǎo)航方法(next和previous)來(lái)輕松識(shí)別。

  • 使用迭代器的客戶端代碼可能沒(méi)有其所遍歷的集合的直接訪問(wèn)權(quán)限(二者是完全分離的)。


下面羅列了一個(gè)對(duì)人員集合進(jìn)行排序的迭代器模式。

人員迭代器

????///?<summary>///?人員迭代器///?繼承接口IEnumerator,顯示實(shí)現(xiàn)了Current、MoveNext、Reset方法。///?</summary>abstract?class?PeopleIterator:IEnumerator??{????????public?abstract?int?Key();public?abstract?object?Current();public?abstract?bool?MoveNext();??public?abstract?void?Reset();object?IEnumerator.Current{get?{?return?Current();?}}}

抽象集合迭代器和其實(shí)現(xiàn)

????///?<summary>///?抽象的集合迭代器///?</summary>public?abstract?class?AggregateIterator?:IEnumerable{///?<summary>///?得到內(nèi)部的集合///?</summary>///?<returns></returns>public?abstract?IEnumerator?GetEnumerator();}///?<summary>///?集合的迭代器類///?具體排序的邏輯在這里寫著///?</summary>class?AlphabeticalOrderIterator?:?PeopleIterator{private?PeopleCollection?_collection;private?int?_position?=?-1;private?bool?_reverse?=?false;public?AlphabeticalOrderIterator(PeopleCollection?collection,bool?reverse=false){this._collection?=?collection;_reverse?=?reverse;if?(reverse){_position?=?collection.getItems().Count;}????????????}///?<summary>///?當(dāng)前的值///?</summary>///?<returns></returns>public?override?object?Current(){return?this._collection.getItems()[_position];???????????}///?<summary>///?此時(shí)的索引///?</summary>///?<returns></returns>public?override?int?Key(){return?this._position;}///?<summary>///?下一個(gè)??位置position進(jìn)行調(diào)整///?</summary>///?<returns></returns>public?override?bool?MoveNext(){int?updatedPosition?=?this._position?+?(this._reverse???-1?:?1);if?(updatedPosition?>=?0?&&?updatedPosition?<?this._collection.getItems().Count){this._position?=?updatedPosition;return?true;}else{return?false;}}///?<summary>///?重置///?</summary>public?override?void?Reset(){this._position?=?this._reverse???this._collection.getItems().Count?-?1?:?0;}}

具體的人員集合和其Main()方法驗(yàn)證

????///?<summary>///?具體的人員集合///?</summary>public?class?PeopleCollection?:AggregateIterator{List<string>?_collection?=?new?List<string>();bool?_direction?=?false;public?void?ReverseDirection()?{_direction?=?!_direction;}public?List<string>?getItems()?{return?_collection;}public?void?AddItem(string?item)?{_collection.Add(item);}public?override?IEnumerator?GetEnumerator(){return?new?AlphabeticalOrderIterator(this,_direction);}}class?Program{static?void?Main(string[]?args){var?collection?=?new?PeopleCollection();collection.AddItem("阿五");collection.AddItem("阿六");collection.AddItem("阿七");Console.WriteLine("遍歷下");foreach?(var?item?in?collection){Console.WriteLine(item);}Console.WriteLine("倒序");collection.ReverseDirection();foreach?(var?item?in?collection){Console.WriteLine(item);}Console.ReadKey();}} 輸出結(jié)果

迭代器模式在理解上還是有一點(diǎn)難度的,因?yàn)槠綍r(shí)在使用集合時(shí)各個(gè)語(yǔ)言都已經(jīng)將集合的各種操作方法都已經(jīng)羅列出來(lái)了,調(diào)用人員直觀調(diào)用即可。所以我們?cè)诹私馄湓O(shè)計(jì)模式思想時(shí),還是要多進(jìn)行實(shí)踐和思考。

有些東西看的多了,做的多了,自然而然就明白了。

小寄語(yǔ)

人生短暫,我不想去追求自己看不見(jiàn)的,我只想抓住我能看的見(jiàn)的。

原創(chuàng)不易,給個(gè)關(guān)注。

我是阿輝,感謝您的閱讀,如果對(duì)你有幫助,麻煩關(guān)注、點(diǎn)贊、轉(zhuǎn)發(fā) 謝謝。

總結(jié)

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

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