版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Design Patterns迭代器模式劉 偉 (Sunny)大綱迭代器模式概述迭代器模式的結(jié)構(gòu)與實現(xiàn)迭代器模式的應(yīng)用實例使用內(nèi)部類實現(xiàn)迭代器.NET內(nèi)置迭代器迭代器模式的優(yōu)缺點與適用環(huán)境遙控器2迭代器模式概述電視機遙控器與電視機示意圖3迭代器模式概述分析電視機 存儲電視頻道的集合 聚合類(Aggregate Classes)電視機遙控器 操作電視頻道 迭代器(Iterator)訪問一個聚合對象中的元素但又不需要暴露它的內(nèi)部結(jié)構(gòu)4迭代器模式概述分析聚合對象的兩個職責(zé):存儲數(shù)據(jù),聚合對象的基本職責(zé)遍歷數(shù)據(jù),既是可變化的,又是可分離的將遍歷數(shù)據(jù)的行為從聚合對象中分離出來,封裝在迭代器對象中由迭代器
2、來提供遍歷聚合對象內(nèi)部數(shù)據(jù)的行為,簡化聚合對象的設(shè)計,更符合單一職責(zé)原則5迭代器模式概述迭代器模式的定義對象行為型模式迭代器模式:提供一種方法順序訪問一個聚合對象中各個元素,且不用暴露該對象的內(nèi)部表示。Iterator Pattern: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.6迭代器模式概述迭代器模式的定義又名游標(biāo)(Cursor)模式通過引入迭代器,客戶端無須了解聚合對象的內(nèi)部結(jié)構(gòu)即可實現(xiàn)對聚合
3、對象中成員的遍歷,還可以根據(jù)需要很方便地增加新的遍歷方式7迭代器模式的結(jié)構(gòu)與實現(xiàn)迭代器模式的結(jié)構(gòu)8迭代器模式的結(jié)構(gòu)與實現(xiàn)迭代器模式的結(jié)構(gòu)迭代器模式包含以下4個角色:Iterator(抽象迭代器)ConcreteIterator(具體迭代器)Aggregate(抽象聚合類)ConcreteAggregate(具體聚合類)9迭代器模式的結(jié)構(gòu)與實現(xiàn)迭代器模式的實現(xiàn)典型的抽象迭代器代碼:interface Iterator void First(); /將游標(biāo)指向第一個元素 void Next(); /將游標(biāo)指向下一個元素 bool HasNext(); /判斷是否存在下一個元素 object Cur
4、rentItem(); /獲取游標(biāo)指向的當(dāng)前元素10迭代器模式的結(jié)構(gòu)與實現(xiàn)迭代器模式的實現(xiàn)典型的具體迭代器代碼:class ConcreteIterator : Iterator private ConcreteAggregate objects; /維持一個對具體聚合對象的引用,以便于訪問存儲在聚合對象中的數(shù)據(jù) private int cursor; /定義一個游標(biāo),用于記錄當(dāng)前訪問位置 public ConcreteIterator(ConcreteAggregate objects) this.objects = objects; public void First() /實現(xiàn)代碼 pu
5、blic void Next() /實現(xiàn)代碼 public bool HasNext() /實現(xiàn)代碼 public object CurrentItem() /實現(xiàn)代碼 11迭代器模式的結(jié)構(gòu)與實現(xiàn)迭代器模式的實現(xiàn)典型的抽象聚合類代碼:interface Aggregate Iterator CreateIterator();12迭代器模式的結(jié)構(gòu)與實現(xiàn)迭代器模式的實現(xiàn)典型的具體聚合類代碼:class ConcreteAggregate : Aggregate . public Iterator CreateIterator() return new ConcreteIterator(this);
6、 .13迭代器模式的應(yīng)用實例實例說明某軟件公司為某商場開發(fā)了一套銷售管理系統(tǒng),在對該系統(tǒng)進(jìn)行分析和設(shè)計時,開發(fā)人員發(fā)現(xiàn)經(jīng)常需要對系統(tǒng)中的商品數(shù)據(jù)、客戶數(shù)據(jù)等進(jìn)行遍歷,為了復(fù)用這些遍歷代碼,開發(fā)人員設(shè)計了一個抽象的數(shù)據(jù)集合類AbstractObjectList,將存儲商品和客戶等數(shù)據(jù)的類作為其子類,AbstractObjectList類結(jié)構(gòu)如下圖所示: AbstractObjectList類結(jié)構(gòu)圖在圖中,List類型的對象objects用于存儲數(shù)據(jù),其方法與說明如下表所示:AbstractObjectList類的方法與說明AbstractObjectList類的子類ProductList和Cus
7、tomerList分別用于存儲商品數(shù)據(jù)和客戶數(shù)據(jù)。通過分析,發(fā)現(xiàn)AbstractObjectList類的職責(zé)非常重,它既負(fù)責(zé)存儲和管理數(shù)據(jù),又負(fù)責(zé)遍歷數(shù)據(jù),違背了單一職責(zé)原則,實現(xiàn)代碼將非常復(fù)雜。因此,開發(fā)人員決定使用迭代器模式對AbstractObjectList類進(jìn)行重構(gòu),將負(fù)責(zé)遍歷數(shù)據(jù)的方法提取出來,封裝到專門的類中,實現(xiàn)數(shù)據(jù)存儲和數(shù)據(jù)遍歷分離,還可以給不同的具體數(shù)據(jù)集合類提供不同的遍歷方式?,F(xiàn)給出使用迭代器模式重構(gòu)后的解決方案。 方法名方法說明AbstractObjectList()構(gòu)造方法,用于給objects對象賦值A(chǔ)ddObject()增加元素RemoveObject()刪除元素
8、GetObjects()獲取所有元素Next()移至下一個元素IsLast()判斷當(dāng)前元素是否是最后一個元素Previous()移至上一個元素IsFirst()判斷當(dāng)前元素是否是第一個元素GetNextItem()獲取下一個元素GetPreviousItem()獲取上一個元素14迭代器模式的應(yīng)用實例實例類圖銷售管理系統(tǒng)數(shù)據(jù)遍歷結(jié)構(gòu)圖15迭代器模式的應(yīng)用實例實例代碼(1) AbstractObjectList:抽象聚合類(2) ProductList:商品數(shù)據(jù)類,充當(dāng)具體聚合類(3) AbstractIterator:抽象迭代器(4) ProductIterator:商品迭代器,充當(dāng)具體迭代器(
9、5) Program:客戶端測試類演示參考代碼 (DesignPatternIteratorSample)16迭代器模式的應(yīng)用實例結(jié)果及分析如果需要增加一個新的具體聚合類,只需增加一個新的聚合子類和一個新的具體迭代器類即可,原有類庫代碼無須修改,符合開閉原則如果需要更換一個迭代器,只需要增加一個新的具體迭代器類作為抽象迭代器類的子類,重新實現(xiàn)遍歷方法即可,原有迭代器代碼無須修改,也符合開閉原則如果要在迭代器中增加新的方法,則需要修改抽象迭代器的源代碼,這將違背開閉原則17使用內(nèi)部類實現(xiàn)迭代器實現(xiàn)/ProductListNew.cs 使用內(nèi)部類實現(xiàn)的商品數(shù)據(jù)類using System.Colle
10、ctions.Generic;namespace IteratorSample class ProductListNew : AbstractObjectList public ProductListNew(List products) : base(products) public override AbstractIterator CreateIterator() return new ProductIterator(); /商品迭代器:具體迭代器,內(nèi)部類實現(xiàn) private class ProductIterator : AbstractIterator /迭代器實現(xiàn)代碼 18.NET內(nèi)
11、置迭代器枚舉接口:System.Collections.IEnumerablepublic interface IEnumerable IEnumerator GetEnumerator(); /工廠方法,獲取迭代器對象19.NET內(nèi)置迭代器抽象的迭代器接口:System.Collections.IEnumeratorpublic interface IEnumerator object Current get; /返回當(dāng)前集合中的元素bool MoveNext(); /遍歷集合,移至下一個元素void Reset(); /恢復(fù)初始位置 20.NET內(nèi)置迭代器分析ICollection繼承自I
12、Enumerable,IList繼承自ICollection,而ArrayList是IList的子類,實現(xiàn)了GetEnumerator()方法,并返回一個ArrayListEnumeratorSimple類型的對象public class ArrayList : IList, ICloneablepublic virtual IEnumerator GetEnumerator() return new ArrayListEnumeratorSimple(this);.Serializableprivate class ArrayListEnumeratorSimple : IEnumerato
13、r, ICloneable /Methods internal ArrayListEnumeratorSimple(ArrayList list) this.list = list; this.index = -1; this.version = list._version; this.currentElement = list; public object Clone()/實現(xiàn)略 public virtual bool MoveNext()/實現(xiàn)略 public virtual void Reset()/實現(xiàn)略 public virtual object Current/實現(xiàn)略 /Field
14、s private object currentElement; private int index; private ArrayList list; private int version;21.NET內(nèi)置迭代器分析IEnumerable 抽象聚合類IEnumerator 抽象迭代器ArrayList 具體聚合類ArrayListEnumeratorSimple 具體迭代器22.NET內(nèi)置迭代器應(yīng)用實例using System;using System.Collections;namespace IteratorSample class Program static void Process
15、(IEnumerable e) IEnumerator i = e.GetEnumerator(); /創(chuàng)建迭代器對象 while (i.MoveNext() Console.WriteLine(i.Current.ToString(); static void Main(string args) IList persons; persons = new ArrayList(); /創(chuàng)建一個ArrayList類型的聚合對象 persons.Add(張無忌); persons.Add(小龍女); persons.Add(令狐沖); persons.Add(韋小寶); persons.Add(袁紫衣); persons.Add(小龍女); Process(persons); Console.Read(); 張無忌小龍女令狐沖韋小寶袁紫衣小龍女23迭代器模式的優(yōu)缺點與適用環(huán)境模式優(yōu)點支持以不同的方式遍歷一個聚合對象,在同一個聚合對象上可以定義多種遍歷方式簡化了聚合類由于引入了抽象層,增加新的聚合類和迭代器類都很方便,無須修改原有代碼,符合開閉原則24迭代器模式的優(yōu)缺點與適用環(huán)境模式缺點在增加新的聚合類時需要對應(yīng)地增加新的迭代器類,類的個數(shù)成對增加,這在一定程度上增加了系統(tǒng)的復(fù)雜性抽象迭代器的設(shè)計難度較大
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- BMS軟件工程師招聘面試題及答案
- 打工管理學(xué)考試題及答案
- 未來五年血粉企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 未來五年功能性器件企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報告
- 226湖南郴州市宜章縣婦幼保健院招募見習(xí)生2人備考題庫附答案
- 中共自貢市貢井區(qū)委社會工作部2025年新興領(lǐng)域黨建工作專員招聘考試備考題庫附答案
- 烏蘭縣公安局2025年面向社會公開招聘警務(wù)輔助人員參考題庫必考題
- 興國縣2025年招聘城市社區(qū)專職網(wǎng)格員【23人】備考題庫附答案
- 北京市石景山區(qū)教育系統(tǒng)教育人才庫教師招聘參考題庫必考題
- 四川省經(jīng)濟和信息化廳直屬事業(yè)單位2025年公開考核招聘工作人員(30人)參考題庫必考題
- 四川能投綜合能源有限責(zé)任公司員工公開招聘筆試備考試題及答案解析
- 2025福建省安全員C證考試(專職安全員)題庫附答案
- 中國話語體系中的國際傳播話語創(chuàng)新策略分析課題申報書
- 高標(biāo)準(zhǔn)基本農(nóng)田建設(shè)項目監(jiān)理工作總結(jié)報告
- 2026中國電氣裝備集團有限公司高層次人才招聘筆試備考試題及答案解析
- 消防知識培訓(xùn)宣傳課件
- 2025-2026學(xué)年通-用版英語 高一上學(xué)期期末試題(含聽力音頻答案)
- 2025年國家基本公共衛(wèi)生服務(wù)考試試題(附答案)
- 25秋蘇教三年級上冊數(shù)學(xué)期末押題卷5套(含答案)
- 局部晚期腫瘤免疫放療新策略
- 食品加工廠乳制品設(shè)備安裝方案
評論
0/150
提交評論