19+C#設計模式-迭代器模式_第1頁
19+C#設計模式-迭代器模式_第2頁
19+C#設計模式-迭代器模式_第3頁
19+C#設計模式-迭代器模式_第4頁
19+C#設計模式-迭代器模式_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Design Patterns迭代器模式劉 偉 (Sunny)大綱迭代器模式概述迭代器模式的結(jié)構(gòu)與實現(xiàn)迭代器模式的應用實例使用內(nèi)部類實現(xiàn)迭代器.NET內(nèi)置迭代器迭代器模式的優(yōu)缺點與適用環(huán)境遙控器2迭代器模式概述電視機遙控器與電視機示意圖3迭代器模式概述分析電視機 存儲電視頻道的集合 聚合類(Aggregate Classes)電視機遙控器 操作電視頻道 迭代器(Iterator)訪問一個聚合對象中的元素但又不需要暴露它的內(nèi)部結(jié)構(gòu)4迭代器模式概述分析聚合對象的兩個職責:存儲數(shù)據(jù),聚合對象的基本職責遍歷數(shù)據(jù),既是可變化的,又是可分離的將遍歷數(shù)據(jù)的行為從聚合對象中分離出來,封裝在迭代器對象中由迭代器

2、來提供遍歷聚合對象內(nèi)部數(shù)據(jù)的行為,簡化聚合對象的設計,更符合單一職責原則5迭代器模式概述迭代器模式的定義對象行為型模式迭代器模式:提供一種方法順序訪問一個聚合對象中各個元素,且不用暴露該對象的內(nèi)部表示。Iterator Pattern: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.6迭代器模式概述迭代器模式的定義又名游標(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(); /將游標指向第一個元素 void Next(); /將游標指向下一個元素 bool HasNext(); /判斷是否存在下一個元素 object Cur

4、rentItem(); /獲取游標指向的當前元素10迭代器模式的結(jié)構(gòu)與實現(xiàn)迭代器模式的實現(xiàn)典型的具體迭代器代碼:class ConcreteIterator : Iterator private ConcreteAggregate objects; /維持一個對具體聚合對象的引用,以便于訪問存儲在聚合對象中的數(shù)據(jù) private int cursor; /定義一個游標,用于記錄當前訪問位置 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迭代器模式的應用實例實例說明某軟件公司為某商場開發(fā)了一套銷售管理系統(tǒng),在對該系統(tǒng)進行分析和設計時,開發(fā)人員發(fā)現(xiàn)經(jīng)常需要對系統(tǒng)中的商品數(shù)據(jù)、客戶數(shù)據(jù)等進行遍歷,為了復用這些遍歷代碼,開發(fā)人員設計了一個抽象的數(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類的職責非常重,它既負責存儲和管理數(shù)據(jù),又負責遍歷數(shù)據(jù),違背了單一職責原則,實現(xiàn)代碼將非常復雜。因此,開發(fā)人員決定使用迭代器模式對AbstractObjectList類進行重構(gòu),將負責遍歷數(shù)據(jù)的方法提取出來,封裝到專門的類中,實現(xiàn)數(shù)據(jù)存儲和數(shù)據(jù)遍歷分離,還可以給不同的具體數(shù)據(jù)集合類提供不同的遍歷方式。現(xiàn)給出使用迭代器模式重構(gòu)后的解決方案。 方法名方法說明AbstractObjectList()構(gòu)造方法,用于給objects對象賦值A(chǔ)ddObject()增加元素RemoveObject()刪除元素

8、GetObjects()獲取所有元素Next()移至下一個元素IsLast()判斷當前元素是否是最后一個元素Previous()移至上一個元素IsFirst()判斷當前元素是否是第一個元素GetNextItem()獲取下一個元素GetPreviousItem()獲取上一個元素14迭代器模式的應用實例實例類圖銷售管理系統(tǒng)數(shù)據(jù)遍歷結(jié)構(gòu)圖15迭代器模式的應用實例實例代碼(1) AbstractObjectList:抽象聚合類(2) ProductList:商品數(shù)據(jù)類,充當具體聚合類(3) AbstractIterator:抽象迭代器(4) ProductIterator:商品迭代器,充當具體迭代器(

9、5) Program:客戶端測試類演示參考代碼 (DesignPatternIteratorSample)16迭代器模式的應用實例結(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; /返回當前集合中的元素bool MoveNext(); /遍歷集合,移至下一個元素void Reset(); /恢復初始位置 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)置迭代器應用實例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)境模式缺點在增加新的聚合類時需要對應地增加新的迭代器類,類的個數(shù)成對增加,這在一定程度上增加了系統(tǒng)的復雜性抽象迭代器的設計難度較大

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論