迭代器模式實(shí)驗(yàn)(含答案)_第1頁(yè)
迭代器模式實(shí)驗(yàn)(含答案)_第2頁(yè)
迭代器模式實(shí)驗(yàn)(含答案)_第3頁(yè)
迭代器模式實(shí)驗(yàn)(含答案)_第4頁(yè)
迭代器模式實(shí)驗(yàn)(含答案)_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、題,不能對(duì)同一個(gè)容器對(duì)象同時(shí)進(jìn)行多個(gè)遍歷。第二種方式倒是省事,卻又將容器的內(nèi)部細(xì)節(jié)暴露無(wú)遺。而迭代器模式的出現(xiàn),很好的解決了上面兩種情況的弊端。迭代器模式的類圖如下圖所示:    類圖解讀:從結(jié)構(gòu)上可以看出,迭代器模式在客戶與容器之間加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器內(nèi)部細(xì)節(jié)的暴露,而且也使得設(shè)計(jì)符號(hào)“單一職責(zé)原則”。注意,在迭代器模式中,具體迭代器角色和具體容器角色是耦合在一起的遍歷算法是與容器的內(nèi)部細(xì)節(jié)緊密相關(guān)的。為了使客戶程序從與具體迭代器角色耦合的困境中脫離出來(lái),避免具體迭代器角色的更換給客戶程序帶來(lái)的修改,迭代器模式抽象了具體迭代器

4、角色,使得客戶程序更具一般性和重用性。這被稱為多態(tài)迭代。迭代器模式所涉及的角色有:參與者:迭代器角色(Iterator):定義訪問(wèn)和遍歷元素的接口。具體迭代器角色(Concrete Iterator):關(guān)聯(lián)到被迭代的具體聚集對(duì)象角色,繼承迭代器角色實(shí)現(xiàn)具體的迭代,并負(fù)責(zé)管理記錄遍歷中的當(dāng)前位置。聚集對(duì)象抽象角色(Aggregate):負(fù)責(zé)提供創(chuàng)建具體迭代器角色的接口。具體聚集對(duì)象角色(Concrete Aggreate):持有一個(gè)對(duì)象的集合,實(shí)現(xiàn)創(chuàng)建具體迭代器角色的接口,返回集合遍歷所依賴的一個(gè)迭代器。l 一個(gè)迭代器模式例子:l 20世紀(jì)80年代的黑白電視機(jī),沒(méi)有遙控器,每次開(kāi)關(guān)機(jī)或者換臺(tái)都需

5、要通過(guò)電視機(jī)上面的那些按鈕來(lái)完成,如果你想換臺(tái)的話,需要親自用手去旋轉(zhuǎn)換臺(tái)的按鈕,每轉(zhuǎn)一下就“啪”的響一聲,如果沒(méi)有收到任何電視頻道就會(huì)出現(xiàn)一片讓人眼花的雪花點(diǎn)。還要移動(dòng)電視機(jī)上面那兩根可以前后左右移動(dòng)變長(zhǎng)變短的天線。隨著科技的飛速發(fā)展,越來(lái)越高級(jí)的電視機(jī)相繼出現(xiàn),那種古老的電視機(jī)幾乎看不到了。與那時(shí)的電視機(jī)相比,現(xiàn)今的電視機(jī)給我們帶來(lái)的最大便利之一就是增加了電視機(jī)遙控器,我們?cè)谶M(jìn)行開(kāi)機(jī)、關(guān)機(jī)、換臺(tái)、改變音量等操作時(shí)都無(wú)須直接操作電視機(jī),可以通過(guò)遙控器來(lái)間接實(shí)現(xiàn)。我們可以將電視機(jī)看成一個(gè)存儲(chǔ)電視頻道的集合對(duì)象,通過(guò)遙控器可以對(duì)電視機(jī)中的電視頻道集合進(jìn)行操作,如返回上一個(gè)頻道、跳轉(zhuǎn)到下一個(gè)頻道或

6、者跳轉(zhuǎn)至指定的頻道。遙控器為我們操作電視頻道帶來(lái)很大的方便,用戶并不需要知道這些頻道到底如何存儲(chǔ)在電視機(jī)中。電視機(jī)遙控器和電視機(jī)示意圖如圖1所示:ll 在軟件開(kāi)發(fā)中,也存在大量類似電視機(jī)一樣的類,它們可以存儲(chǔ)多個(gè)成員對(duì)象(元素),這些類通常稱為聚合類(Aggregate Classes),對(duì)應(yīng)的對(duì)象稱為聚合對(duì)象。為了更加方便地操作這些聚合對(duì)象,同時(shí)可以很靈活地為聚合對(duì)象增加不同的遍歷方法,我們也需要類似電視機(jī)遙控器一樣的角色,可以訪問(wèn)一個(gè)聚合對(duì)象中的元素但又不需要暴露它的內(nèi)部結(jié)構(gòu)。本章我們將要學(xué)習(xí)的迭代器模式將為聚合對(duì)象提供一個(gè)遙控器,通過(guò)引入迭代器,客戶端無(wú)須了解聚合對(duì)象的內(nèi)部結(jié)構(gòu)即可實(shí)現(xiàn)對(duì)

7、聚合對(duì)象中成員的遍歷,還可以根據(jù)需要很方便地增加新的遍歷方式。l 迭代器模式的作用:l 迭代器模式能夠遍歷一組聚合對(duì)象,不需要了解其內(nèi)部結(jié)構(gòu)還能提供不同的遍歷方法。l 就是分離了集合對(duì)象的遍歷行為,將遍歷算法交給這個(gè)迭代器角色來(lái)完成,可以很好的避免容器內(nèi)部細(xì)節(jié)的暴露,而且也使得設(shè)計(jì)符合“單一職責(zé)原則”,另外迭代器模式抽象了具體迭代器角色,可以通過(guò)對(duì)一個(gè)抽象迭代器多個(gè)集成可來(lái)完成同一聚集對(duì)象的多種遍歷。五、迭代器模式示例性代碼首先有一個(gè)抽象的聚集,所謂的聚集就是就是數(shù)據(jù)的集合,可以循環(huán)去訪問(wèn)它。它只有一個(gè)方法GetIterator()讓子類去實(shí)現(xiàn),用來(lái)獲得一個(gè)迭代器對(duì)象。1 /

8、0;<summary> 2  3 / 抽象聚集 4  5 / </summary> 6  7 public interface IList 8  9 10     IIterator GetIterator();11     抽象的迭代器,它是用來(lái)訪問(wèn)聚集的類,封裝了一些方法

9、,用來(lái)把聚集中的數(shù)據(jù)按順序讀取出來(lái)。通常會(huì)有MoveNext()、CurrentItem()、Fisrt()、Next()等幾個(gè)方法讓子類去實(shí)現(xiàn)。1 / <summary> 2  3 / 抽象迭代器 4  5 / </summary> 6  7 public interface IIterator 8  9     

10、;bool MoveNext();10 11     Object CurrentItem();12 13     void First();14 15     void Next();16     具體的聚集,它實(shí)現(xiàn)了抽象聚集中的唯一的方法,同時(shí)在里面保存了一組數(shù)據(jù),這里我們加上Length屬性和GetElement()方法是為了便于訪

11、問(wèn)聚集中的數(shù)據(jù)。 1 / <summary> 2  3 / 具體聚集 4  5 / </summary> 6  7 public class ConcreteList : IList 8  9     int list;10 11   

12、  public ConcreteList()12 13     14         list = new int  1,2,3,4,5;15     16 17     public IIterator GetIterator()18&

13、#160;19     20         return new ConcreteIterator(this);21     22 23     public int Length24 25     26   

14、0;     get  return list.Length; 27     28 29     public int GetElement(int index)30 31     32         return&#

15、160;listindex;33     34     具體迭代器,實(shí)現(xiàn)了抽象迭代器中的四個(gè)方法,在它的構(gòu)造函數(shù)中需要接受一個(gè)具體聚集類型的參數(shù),在這里面我們可以根據(jù)實(shí)際的情況去編寫(xiě)不同的迭代方式。 1 /*/ <summary> 2  3 / 具體迭代器 4  5 / </summary> 6  7 public

16、 class ConcreteIterator : IIterator 8  9 10     private ConcreteList list;11 12     private int index;13 14     public ConcreteIterator(ConcreteList&#

17、160;list)15 16     17         this.list = list;18 19         index = 0;20     21 22     public 

18、bool MoveNext()23 24     25         if (index < list.Length)26 27             return true;28 29    

19、60;    else30 31             return false;32     33 34     public Object CurrentItem()35 36     37  

20、       return list.GetElement(index) 38     39 40     public void First()41 42     43         index = 0;4

21、4     45 46     public void Next()47 48     49         if (index < list.Length)50 51         

22、;52             index+;53         54     55  簡(jiǎn)單的客戶端程序調(diào)用: 1 /*/ <summary> 2  3 / 客戶端程序 4  5

23、0;/ </summary> 6  7 class Program 8  9 10     static void Main(string args)11 12     13         IIterator iterator;14 1

24、5         IList list = new ConcreteList();16 17         iterator = list.GetIterator();18 19         while (iterator.Move

25、Next()20 21         22             int i = (int)iterator.CurrentItem();23             Console.WriteLine(i

26、.ToString();24 25             iterator.Next();26         27 28         Console.Read();29 30     31 3

27、2 Iterator實(shí)現(xiàn)要點(diǎn):1迭代抽象:訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)需暴露它的內(nèi)部表示。2迭代多態(tài):為遍歷不同的集合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進(jìn)行操作。3迭代器的健壯性考慮:遍歷的同時(shí)更改迭代器所在的集合結(jié)構(gòu),會(huì)導(dǎo)致問(wèn)題。題目:假設(shè)某軟件公司Z為某超市開(kāi)發(fā)了一套銷售管理系統(tǒng),在對(duì)該系統(tǒng)進(jìn)行分析和設(shè)計(jì)時(shí),Z公司開(kāi)發(fā)人員發(fā)現(xiàn)經(jīng)常需要對(duì)系統(tǒng)中的商品數(shù)據(jù)、客戶數(shù)據(jù)等進(jìn)行遍歷,為了復(fù)用這些遍歷代碼,Z公司開(kāi)發(fā)人員設(shè)計(jì)了一個(gè)抽象的數(shù)據(jù)聚合類AbstractObjectList,而將存儲(chǔ)商品和客戶登記的類作為其子類。AbstractObjectList類結(jié)構(gòu)如下圖

28、所示。在上圖中,IList類型的對(duì)象objects用于存儲(chǔ)數(shù)據(jù),AbstractObjectList類的方法說(shuō)明如下表所示:AbstractObjectList類的子類ProductList和CustomerList分別用于存儲(chǔ)商品數(shù)據(jù)和客戶數(shù)據(jù)。請(qǐng)用迭代器模式編程實(shí)現(xiàn)。代碼:import java.util.*; /抽象聚合類 abstract class AbstractObjectList protected List<Object> objects = new ArrayList<Object>(); public AbstractObjectList(List

29、 objects) this.objects = objects; public void addObject(Object obj) this.objects.add(obj); public void removeObject(Object obj) this.objects.remove(obj); public List getObjects() return this.objects; /聲明創(chuàng)建迭代器對(duì)象的抽象工廠方法 public abstract AbstractIterator createIterator(); /商品數(shù)據(jù)類:具體聚合類 class ProductList

30、extends AbstractObjectList public ProductList(List products) super(products); /實(shí)現(xiàn)創(chuàng)建迭代器對(duì)象的具體工廠方法 public AbstractIterator createIterator() return new ProductIterator(this); /客戶數(shù)據(jù)類:具體聚合類 class CustomerList extends AbstractObjectList public CustomerList(List customers) super(customers); /實(shí)現(xiàn)創(chuàng)建迭代器對(duì)象的具體工廠方

31、法 public AbstractIterator createIterator() return new CustomerIterator(this); /抽象迭代器 interface AbstractIterator public void next(); /移至下一個(gè)元素 public boolean isLast(); /判斷是否為最后一個(gè)元素 public void previous(); /移至上一個(gè)元素 public boolean isFirst(); /判斷是否為第一個(gè)元素 public Object getNextItem(); /獲取下一個(gè)元素 public Objec

32、t getPreviousItem(); /獲取上一個(gè)元素 /商品迭代器:具體迭代器 class ProductIterator implements AbstractIterator private ProductList productList; private List products; private int cursor1; /定義一個(gè)游標(biāo),用于記錄正向遍歷的位置 private int cursor2; /定義一個(gè)游標(biāo),用于記錄逆向遍歷的位置 public ProductIterator(ProductList list) ductList = list; thi

33、ducts = list.getObjects(); /獲取集合對(duì)象 cursor1 = 0; /設(shè)置正向遍歷游標(biāo)的初始值 cursor2 = products.size() -1; /設(shè)置逆向遍歷游標(biāo)的初始值 public void next() if(cursor1 < products.size() cursor1+; public boolean isLast() return (cursor1 = products.size(); public void previous() if (cursor2 > -1) cursor2-; public boolean

34、isFirst() return (cursor2 = -1); public Object getNextItem() return products.get(cursor1); public Object getPreviousItem() return products.get(cursor2); /客戶迭代器:具體迭代器 class CustomerIterator implements AbstractIterator private CustomerList customerList; private List customers; private int cursor1; /定義

35、一個(gè)游標(biāo),用于記錄正向遍歷的位置 private int cursor2; /定義一個(gè)游標(biāo),用于記錄逆向遍歷的位置 public CustomerIterator(CustomerList list) this.customerList = list; this.customers = list.getObjects(); /獲取集合對(duì)象 cursor1 = 0; /設(shè)置正向遍歷游標(biāo)的初始值 cursor2 = customers.size() -1; /設(shè)置逆向遍歷游標(biāo)的初始值 public void next() if(cursor1 < customers.size() curso

36、r1+; public boolean isLast() return (cursor1 = customers.size(); public void previous() if (cursor2 > -1) cursor2-; public boolean isFirst() return (cursor2 = -1); public Object getNextItem() return customers.get(cursor1); public Object getPreviousItem() return customers.get(cursor2); public class Iterator public static void main(String args) List<String> products = new ArrayList<String>(); products.add("農(nóng)夫山泉"); products.add("百歲山"); products.add("康師傅"); products.add("旺仔"

溫馨提示

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

評(píng)論

0/150

提交評(píng)論