最新迭代器模式實驗(含答案)_第1頁
最新迭代器模式實驗(含答案)_第2頁
最新迭代器模式實驗(含答案)_第3頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、課程名稱: 軟件體系結(jié)構(gòu)與設計迭代器( Iterator )模式實驗一、實驗目的1. 掌握迭代器模式的概念;2. 掌握迭代器模式的功能;3. 加深對迭代器模式的了解;4. 提高對迭代器模式的運用;5. 將該模式運用但實際的生活中。二、實驗內(nèi)容1. 閱讀和查看資料了解迭代器模式的概念和功能;2. 將有關(guān)代理模式的迭代器模式理解透徹并運行;3. 舉例說明生活中的一個可以使用迭代器模式的例子;4. 熟悉迭代器模式的擴展,迭代器模式是比較有用途的一種模式, 而且變種較多,應用場合覆蓋從小結(jié)構(gòu)到整個系統(tǒng)的大結(jié)構(gòu)。三、實驗環(huán)境Windows7 、Java 虛擬機 、MyEclipse 環(huán)境下運行代碼。四、

2、實驗設計原理迭代器(Iterator)模式,又叫做游標(Cursor)模式。它提供一 種方法順序訪問一個聚合對象(或容器對象:co nta in er)中各個元素, 而又不需暴露該對象的內(nèi)部。聚合:表示一組對象的組合結(jié)構(gòu),比如 JAVA 中的數(shù)組,集合等從定 義可見,迭代器模式是為容器而生。很明顯,對容器對象的訪問必然 涉及到遍歷算法。你可以一股腦的將遍歷方法塞到容器對象中去; 或 者根本不去提供什么遍歷算法,讓使用容器的人自己去實現(xiàn)去吧。 這 兩種情況好像都能夠解決問題。然而在前一種情況,容器承受了過多的功能,它不僅要負責自己“容器”內(nèi)的元素維護(添加、刪除等等),而且還要提供遍歷自身 的接

3、口;而且由于遍歷狀態(tài)保存的問題,不能對同一個容器對象同時 進行多個遍歷。第二種方式倒是省事,卻又將容器的內(nèi)部細節(jié)暴露無 遺。而迭代器模式的出現(xiàn),很好的解決了上面兩種情況的弊端。迭代器模式的類圖如下圖所示:具佈誥優(yōu)器類,實現(xiàn)開始、 一下一T、是否結(jié)用|當就對象方法具健衆(zhòng)集焚,罐承A婦豹M J類圖解讀:從結(jié)構(gòu)上可以看出,迭代器模式在客戶與容器之間加入了迭代器 角色。迭代器角色的加入,就可以很好的避免容器內(nèi)部細節(jié)的暴露, 而且也使得設計符號“單一職責原則”。注意,在迭代器模式中,具體迭代器角色和具體容器角色是耦合在一起的一一遍歷算法是與容器的內(nèi)部細節(jié)緊密相關(guān)的。為了使客戶程序從與具體迭代器角色耦合的

4、困境中脫離出來,避免具體迭代器角色的更換給客戶程序帶來的修改,迭代器模式抽象了具體迭代器角色, 使得客戶程序更具一般性和重用性。這被稱為多態(tài)迭代。迭代器模式所涉及的角色有:參與者:?迭代器角色(Iterator):定義訪問和遍歷元素的接口。?具體迭代器角色(Concrete Iterator):關(guān)聯(lián)到被迭代的具體聚集對象角色,繼承迭代器角色實現(xiàn)具體的 迭代,并負責管理記錄遍歷中的當前位置。?聚集對象抽象角色(Aggregate):負責提供創(chuàng)建具體迭代器角色的接口。?具體聚集對象角色(Concrete Aggreate :持有一個對象的集合,實現(xiàn)創(chuàng)建具體迭代器角色的接口,返回集 合遍歷所依賴的一

5、個迭代器。一個迭代器模式例子:20世紀80年代的黑白電視機,沒有遙控器,每次開關(guān)機或者換 臺都需要通過電視機上面的那些按鈕來完成,如果你想換臺的話,需要親自用手去旋轉(zhuǎn)換臺的按鈕,每轉(zhuǎn)一下就“啪”的響一聲, 如果沒有收到任何電視頻道就會出現(xiàn)一片讓人眼花的雪花點。還要移動電視機上面那兩根可以前后左右移動變長變短的天線。隨著科技的飛速發(fā)展,越來越高級的電視機相繼出現(xiàn),那種古老的 電視機幾乎看不到了。與那時的電視機相比,現(xiàn)今的電視機給我 們帶來的最大便利之一就是增加了 電視機遙控器,我們在進行開 機、關(guān)機、換臺、改變音量等操作時都無須直接操作電視機,可 以通過遙控器來間接實現(xiàn)。我們可以將電視機看成一個

6、存儲電視頻道的集合對象,通過遙控器可以對電視機中的電視頻道集合進 行操作,如返回上一個頻道、跳轉(zhuǎn)到下一個頻道或者跳轉(zhuǎn)至指定 的頻道。遙控器為我們操作電視頻道帶來很大的方便,用戶并不 需要知道這些頻道到底如何存儲在電視機中。電視機遙控器和電視機示意圖如圖1所示:電視機遙控器電視機屯視頻道的集合)在軟件開發(fā)中,也存在大量類似電視機一樣的類,它們可以存儲多個成員對象(元素),這些類通常稱為聚合類(Aggregate Classes),對應的對象稱為聚合對象。為了更加方便地操作這些聚合對象,同時可以很靈活地為聚合對象增加不同的遍歷方法,我們也需要類似電視機遙控器一樣的角色,可以訪問一個聚合對象中的元素

7、但又不 需要暴露它的內(nèi)部結(jié)構(gòu)。本章我們將要學習的迭代器模式將為聚合 對象提供一個遙控器,通過引入迭代器,客戶端無須了解聚合對象 的內(nèi)部結(jié)構(gòu)即可實現(xiàn)對聚合對象中成員的遍歷,還可以根據(jù)需要很 方便地增加新的遍歷方式。迭代器模式的作用:迭代器模式能夠遍歷一組聚合對象,不需要了解其內(nèi)部結(jié)構(gòu)還能提供不同的遍歷方法。就是分離了集合對象的遍歷行為,將遍歷算法交給這個迭代器角 色來完成,可以很好的避免容器內(nèi)部細節(jié)的暴露,而且也使得設 計符合“單一職責原則”,另外迭代器模式抽象了具體迭代器角色, 可以通過對一個抽象迭代器多個集成可來完成同一聚集對象的多 種遍歷。五、迭代器模式示例性代碼首先有一個抽象的聚集,所謂

8、的聚集就是就是數(shù)據(jù)的集合,可以循環(huán)去訪問它。它只有一個方法Getlterator()讓子類去實現(xiàn),用來獲得一個迭代器對象。1 / <summary>22 /抽象聚集43 / </summary>64 public in terface IList89 10 llterator Getlterator();11 抽象的迭代器,它是用來訪問聚集的類,封裝了一些方法,用來把聚集中的數(shù)據(jù)按順序讀取岀來。通常會有 MoveNext() 、Currentltem()、Fisrt() 、Next() 等幾個方法讓子類去實現(xiàn)。1 / <summary>22 /抽象迭代器43

9、 / </summary>64 public in terface llterator5 6 bool MoveNext();107 Object Curre ntltem();128 void First();149 void Next();10 具體的聚集,它實現(xiàn)了抽象聚集中的唯一的方法,同時在里面保存了一組數(shù)據(jù),這里我們加 上Length 屬性和GetElement()方法是為了便于訪問聚集中的數(shù)據(jù)。1 / <summary>22 /具體聚集43 / </summary>64 public class ConcreteList : lList5 6 i

10、nt list;107 public ConcreteList()128 9 list = new int 1,2,3,4,5;10 1611 public IIterator Getlterator()1812 13 return new ConcreteIterator( this );14 2223 public int Length2424 25 get returnlist.Length; 26 2827 public int GetElement(int index)3028 29 return listi ndex;30 31 個具體聚集類具體迭代器,實現(xiàn)了抽象迭代器中的四個方法

11、,在它的構(gòu)造函數(shù)中需要接受 型的參數(shù),在這里面我們可以根據(jù)實際的情況去編寫不同的迭代方式。1 /*/ / <summary>22 /具體迭代器43 / </summary>64 public class Concretelterator : IIterator89101112131415161718192021222324252627282930313233343536373839404142private Con creteList list;private int index;public Concretelterator(ConcreteList list)thi

12、s .list = list;in dex = 0;public bool MoveNext()if (in dex < list.Le ngth)return trueelsereturn falsepublic Object CurrentItem()return list.GetEleme nt(i ndex);public void First()43 in dex = 0;44 4545 public void Next()4746 47 if (in dex < list.Le ngth)5048 49 in dex+;50 51 52 簡單的客戶端程序調(diào)用:1 /*/

13、 / <summary>22 /客戶端程序43 / </summary>64 class Program85 6 static void Main( string args)117 8 Ilterator iterator;149 IList list =new ConcreteList();1610 iterator = list.Getlterator();1811 while (iterator.MoveNext()2021 15 int i = ( int )iterator.Currentltem();16 Co nsole.WriteLi ne(i.ToSt

14、ri ng();2417 iterator.Next();18 2719 Co nsole.Read();2920 3121 Iterator實現(xiàn)要點:1 迭代抽象:訪問一個聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示。2迭代多態(tài):為遍歷不同的集合結(jié)構(gòu)提供一個統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進行操作。3迭代器的健壯性考慮:遍歷的同時更改迭代器所在的集合結(jié)構(gòu),會導致問題。題目:假設某軟件公司Z為某超市開發(fā)了一套銷售管理系統(tǒng),在對該系統(tǒng)進行分析和設計時,Z公司開發(fā)人員發(fā)現(xiàn)經(jīng)常需要對系統(tǒng)中的商 品數(shù)據(jù)、客戶數(shù)據(jù)等進行遍歷,為了復用這些遍歷代碼,Z公司開發(fā)人員設計了一個抽象的數(shù)據(jù)聚合類 Abs

15、tractObjectList,而將存儲商品和客戶登記的類作為其子類。AbstractObjectList類結(jié)構(gòu)如下圖所示。AbitractObjectLit-objects JList<object>+ AbtiactObjectList(IList<object> object) + Ad d Ob jet t (o b j ect obj)+ RemoveObject(object obj)+ GetObje-ctsQ+ Next()+ ILastO+Pre¥ioii5()-tlsFirstf)* GetNex十 GetPreviousrtem()在上圖

16、中,IList類型的對象objects用于存儲數(shù)據(jù),AbstractObjectList類的方法說明如下表所示:方払名方法說明AhstrarrOhjcctI-iM( >構(gòu)選方法*用于經(jīng)objectfl對魚航値add()bjrct()站加元實removeObiectf >1H除無累getObj eclat)獲取所有無事ncxt(移至下一個元索is La stt料斷嗎前元累是否屋赧后一牛元素previouat)啟至上一個元累isFirjiO判斷當前元累是否蹇鄭一個元絮getNextltemO供取下一牛元貳getPrHeviOusllem< )獲取上一令元索AbstractObje

17、ctList類的子類 ProductList 和 CustomerList 分別用于存儲商品數(shù)據(jù)和客戶數(shù)據(jù)。請用迭代器模式編程實現(xiàn)。代碼:import java.util.*;/抽象聚合類abstract class AbstractObjectList protected List<Object>objects = new ArrayList<Object>();public AbstractObjectList(Listobjects ) this . objects = objects ;public void addObject(Objectobj ) this

18、 . objects .add( obj );public void removeObject(Objectobj ) this . objects .remove( obj );public List getObjects() return this . objects/聲明創(chuàng)建迭代器對象的抽象工廠方法public abstract AbstractIterator createlterator();/商品數(shù)據(jù)類:具體聚合類class ProductListexte ndsAbstractObjectList public ProductList(List products ) super

19、( products ); I/實現(xiàn)創(chuàng)建迭代器對象的具體工廠方法public AbstractIterator createIterator() return new ProductIterator(this );/客戶數(shù)據(jù)類:具體聚合類class CustomerListexte ndsAbstractObjectList public CustomerList(List customers ) super ( customers ); I/實現(xiàn)創(chuàng)建迭代器對象的具體工廠方法|public AbstractIterator createIterator() return new Custome

20、rIterator(this );/抽象迭代器in terfaceAbstractIterator publicvoidnext();/移至下一個元素publicbooleanisLast();/判斷是否為最后一個兀素publicvoid previous();/移至上一個元素publicboolea n isFirst();/判斷是否為第一個元素publicObject getNextltem();/獲取下一個元素publicObject getPreviousltem();/獲取上一個元素/商品迭代器:具體迭代器class Productiteratorimpleme ntsAbstrac

21、titerator private ProductListproductListprivate List productsprivateint cursor1;/疋義一個游標,用于記錄正向遍歷的位置privateint cursor2;/定義一個游標,用于記錄逆向遍歷的位置publicProductIterator(ProductListlist ) ductList=list ;this . products = list .getObjects();/ 獲取集合對象cursorl = 0;/設置正向遍歷游標的初始值cursor2 = products .size() -1;

22、/設置逆向遍歷游標的初始值public void n ext() if ( cursor1 < products .size() cursor1 +;publicboolea nisLast() return( cursor1 = products .size();public void previous() if ( cursor2 > -1) cursor2 -;publicboolea nisFirst() return( cursor2 = -1);public Object getNextltem() retur nproducts .get( cursorl );pub

23、lic Object getPreviousltem() retur nproducts .get( cursor2 );/客戶迭代器:具體迭代器class CustomerIteratorimpleme nts AbstractIterator private CustomerList customerList ;private List customersprivateint cursor1;/疋義一個游標,用于記錄正向遍歷的位置privateint cursor2;/疋義一個游標,用于記錄逆向遍歷的位置public Customerlterator(CustomerListlist )

24、this . customerList = list ;this . customers = list .getObjects();/ 獲取集合對象cursor1 = 0;/設置正向遍歷游標的初始值cursor2 = customers .size() -1;/設置逆向遍歷游標的初始值public voidn ext() if ( cursor1 < customers .size() cursor1 +;publicboolea nisLast() return ( cursor1 = customers .size();public void previous() if ( curs

25、or2 > -1) cursor2 -;public boolea n isFirst() return( cursor2 = -1);public Object getNextltem() retur ncustomers .get( cursorl );public Object getPreviousltem() retur n customers .get( cursor2 );public class Iterator public static void main(Stringargs ) ListvStri ng>products = new ArrayListvSt

26、r in g>();products.add("農(nóng)夫山泉”);products.add("百歲山“);products.add("康師傅“);products.add("旺仔");products .add("統(tǒng)一");AbstractObjectListlistAbstractiteratoriteratorlist = new ProductList(products );/創(chuàng)建聚合對象iterator= list .createlterator();/創(chuàng)建迭代器對象System.out .println(H*商品數(shù)*);System.out .println("正向遍歷:“);while (!iteratorisLast() System. out .print

溫馨提示

  • 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

提交評論