




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、課程名稱: 軟件體系結(jié)構(gòu)與設(shè)計 迭代器(Iterator)模式實驗一、實驗?zāi)康?. 掌握迭代器模式的概念;2. 掌握迭代器模式的功能;3. 加深對迭代器模式的了解;4. 提高對迭代器模式的運用;5. 將該模式運用但實際的生活中。二、實驗內(nèi)容1. 閱讀和查看資料了解迭代器模式的概念和功能;2. 將有關(guān)代理模式的迭代器模式理解透徹并運行;3. 舉例說明生活中的一個可以使用迭代器模式的例子;4. 熟悉迭代器模式的擴展,迭代器模式是比較有用途的一種模式,而且變種較多,應(yīng)用場合覆蓋從小結(jié)構(gòu)到整個系統(tǒng)的大結(jié)構(gòu)。三、實驗環(huán)境Windows7 、Java虛擬機 、MyEclipse 環(huán)境下運行代碼。4、 實驗
2、設(shè)計原理 迭代器(Iterator)模式,又叫做游標(Cursor)模式。它提供一種方法順序訪問一個聚合對象(或容器對象:container)中各個元素, 而又不需暴露該對象的內(nèi)部。聚合:表示一組對象的組合結(jié)構(gòu),比如JAVA中的數(shù)組,集合等從定義可見,迭代器模式是為容器而生。很明顯,對容器對象的訪問必然涉及到遍歷算法。你可以一股腦的將遍歷方法塞到容器對象中去;或者根本不去提供什么遍歷算法,讓使用容器的人自己去實現(xiàn)去吧。這兩種情況好像都能夠解決問題。然而在前一種情況,容器承受了過多的功能,它不僅要負責自己“容器”內(nèi)的元素維護(添加、刪除等等),而且還要提供遍歷自身的接口;而且由于遍歷狀態(tài)保存的問
3、題,不能對同一個容器對象同時進行多個遍歷。第二種方式倒是省事,卻又將容器的內(nèi)部細節(jié)暴露無遺。而迭代器模式的出現(xiàn),很好的解決了上面兩種情況的弊端。迭代器模式的類圖如下圖所示: 類圖解讀:從結(jié)構(gòu)上可以看出,迭代器模式在客戶與容器之間加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器內(nèi)部細節(jié)的暴露,而且也使得設(shè)計符號“單一職責原則”。注意,在迭代器模式中,具體迭代器角色和具體容器角色是耦合在一起的遍歷算法是與容器的內(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)建具體迭代器角色的接口,返回集合遍歷所依賴的一個迭代器。l 一個迭代器模式例子:l 20世紀80年代的黑白電視機,沒有遙控器,每次開關(guān)機或者換臺都需
5、要通過電視機上面的那些按鈕來完成,如果你想換臺的話,需要親自用手去旋轉(zhuǎn)換臺的按鈕,每轉(zhuǎn)一下就“啪”的響一聲,如果沒有收到任何電視頻道就會出現(xiàn)一片讓人眼花的雪花點。還要移動電視機上面那兩根可以前后左右移動變長變短的天線。隨著科技的飛速發(fā)展,越來越高級的電視機相繼出現(xiàn),那種古老的電視機幾乎看不到了。與那時的電視機相比,現(xiàn)今的電視機給我們帶來的最大便利之一就是增加了電視機遙控器,我們在進行開機、關(guān)機、換臺、改變音量等操作時都無須直接操作電視機,可以通過遙控器來間接實現(xiàn)。我們可以將電視機看成一個存儲電視頻道的集合對象,通過遙控器可以對電視機中的電視頻道集合進行操作,如返回上一個頻道、跳轉(zhuǎn)到下一個頻道或
6、者跳轉(zhuǎn)至指定的頻道。遙控器為我們操作電視頻道帶來很大的方便,用戶并不需要知道這些頻道到底如何存儲在電視機中。電視機遙控器和電視機示意圖如圖1所示:ll 在軟件開發(fā)中,也存在大量類似電視機一樣的類,它們可以存儲多個成員對象(元素),這些類通常稱為聚合類(Aggregate Classes),對應(yīng)的對象稱為聚合對象。為了更加方便地操作這些聚合對象,同時可以很靈活地為聚合對象增加不同的遍歷方法,我們也需要類似電視機遙控器一樣的角色,可以訪問一個聚合對象中的元素但又不需要暴露它的內(nèi)部結(jié)構(gòu)。本章我們將要學(xué)習(xí)的迭代器模式將為聚合對象提供一個遙控器,通過引入迭代器,客戶端無須了解聚合對象的內(nèi)部結(jié)構(gòu)即可實現(xiàn)對
7、聚合對象中成員的遍歷,還可以根據(jù)需要很方便地增加新的遍歷方式。l 迭代器模式的作用:l 迭代器模式能夠遍歷一組聚合對象,不需要了解其內(nèi)部結(jié)構(gòu)還能提供不同的遍歷方法。l 就是分離了集合對象的遍歷行為,將遍歷算法交給這個迭代器角色來完成,可以很好的避免容器內(nèi)部細節(jié)的暴露,而且也使得設(shè)計符合“單一職責原則”,另外迭代器模式抽象了具體迭代器角色,可以通過對一個抽象迭代器多個集成可來完成同一聚集對象的多種遍歷。五、迭代器模式示例性代碼首先有一個抽象的聚集,所謂的聚集就是就是數(shù)據(jù)的集合,可以循環(huán)去訪問它。它只有一個方法GetIterator()讓子類去實現(xiàn),用來獲得一個迭代器對象。1 /
8、0;<summary> 2 3 / 抽象聚集 4 5 / </summary> 6 7 public interface IList 8 9 10 IIterator GetIterator();11 抽象的迭代器,它是用來訪問聚集的類,封裝了一些方法
9、,用來把聚集中的數(shù)據(jù)按順序讀取出來。通常會有MoveNext()、CurrentItem()、Fisrt()、Next()等幾個方法讓子類去實現(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 具體的聚集,它實現(xiàn)了抽象聚集中的唯一的方法,同時在里面保存了一組數(shù)據(jù),這里我們加上Length屬性和GetElement()方法是為了便于訪
11、問聚集中的數(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 具體迭代器,實現(xiàn)了抽象迭代器中的四個方法,在它的構(gòu)造函數(shù)中需要接受一個具體聚集類型的參數(shù),在這里面我們可以根據(jù)實際的情況去編寫不同的迭代方式。 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 簡單的客戶端程序調(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實現(xiàn)要點:1迭代抽象:訪問一個聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示。2迭代多態(tài):為遍歷不同的集合結(jié)構(gòu)提供一個統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進行操作。3迭代器的健壯性考慮:遍歷的同時更改迭代器所在的集合結(jié)構(gòu),會導(dǎo)致問題。題目:假設(shè)某軟件公司Z為某超市開發(fā)了一套銷售管理系統(tǒng),在對該系統(tǒng)進行分析和設(shè)計時,Z公司開發(fā)人員發(fā)現(xiàn)經(jīng)常需要對系統(tǒng)中的商品數(shù)據(jù)、客戶數(shù)據(jù)等進行遍歷,為了復(fù)用這些遍歷代碼,Z公司開發(fā)人員設(shè)計了一個抽象的數(shù)據(jù)聚合類AbstractObjectList,而將存儲商品和客戶登記的類作為其子類。AbstractObjectList類結(jié)構(gòu)如下圖
28、所示。在上圖中,IList類型的對象objects用于存儲數(shù)據(jù),AbstractObjectList類的方法說明如下表所示:AbstractObjectList類的子類ProductList和CustomerList分別用于存儲商品數(shù)據(jù)和客戶數(shù)據(jù)。請用迭代器模式編程實現(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)建迭代器對象的抽象工廠方法 public abstract AbstractIterator createIterator(); /商品數(shù)據(jù)類:具體聚合類 class ProductList
30、extends AbstractObjectList public ProductList(List products) super(products); /實現(xiàn)創(chuàng)建迭代器對象的具體工廠方法 public AbstractIterator createIterator() return new ProductIterator(this); /客戶數(shù)據(jù)類:具體聚合類 class CustomerList extends AbstractObjectList public CustomerList(List customers) super(customers); /實現(xiàn)創(chuàng)建迭代器對象的具體工廠方
31、法 public AbstractIterator createIterator() return new CustomerIterator(this); /抽象迭代器 interface AbstractIterator public void next(); /移至下一個元素 public boolean isLast(); /判斷是否為最后一個元素 public void previous(); /移至上一個元素 public boolean isFirst(); /判斷是否為第一個元素 public Object getNextItem(); /獲取下一個元素 public Objec
32、t getPreviousItem(); /獲取上一個元素 /商品迭代器:具體迭代器 class ProductIterator implements AbstractIterator private ProductList productList; private List products; private int cursor1; /定義一個游標,用于記錄正向遍歷的位置 private int cursor2; /定義一個游標,用于記錄逆向遍歷的位置 public ProductIterator(ProductList list) ductList = list; thi
33、ducts = list.getObjects(); /獲取集合對象 cursor1 = 0; /設(shè)置正向遍歷游標的初始值 cursor2 = products.size() -1; /設(shè)置逆向遍歷游標的初始值 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、一個游標,用于記錄正向遍歷的位置 private int cursor2; /定義一個游標,用于記錄逆向遍歷的位置 public CustomerIterator(CustomerList list) this.customerList = list; this.customers = list.getObjects(); /獲取集合對象 cursor1 = 0; /設(shè)置正向遍歷游標的初始值 cursor2 = customers.size() -1; /設(shè)置逆向遍歷游標的初始值 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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)生讀書分享課件
- 場景深度記錄與分析聘用合同
- 餐飲業(yè)員工培訓(xùn)與晉升管理合同
- 生態(tài)園區(qū)彩鋼房建設(shè)與環(huán)境保護合同
- 月份教學(xué) 課件
- 非金屬礦在塑料改性中的應(yīng)用與市場分析考核試卷
- 慢性病自我監(jiān)測技巧教育考核試卷
- 食品安全檢測與農(nóng)村食品安全科普教育推廣考核試卷
- 危險品分類儲存方法考核試卷
- 二維設(shè)計基礎(chǔ)面試題及答案
- 吊車施工專項施工方案
- 2021年彬縣林業(yè)系統(tǒng)事業(yè)單位招聘考試《林業(yè)基礎(chǔ)知識》試題及答案解析
- 房地產(chǎn)殘余價值估價報告
- 2016河南省通用安裝工程預(yù)算定額-章節(jié)說明
- 浙江省專業(yè)技術(shù)人員年度考核表
- 三坐標操作規(guī)程及注意事項海克斯康
- 中央在京單位職工住房情況登記表
- 航空煤油 MSDS 安全技術(shù)說明書
- serviceinvoicewithhoursandrate服務(wù)發(fā)票模板
- 《普通高中課程方案》解讀.ppt
- 工業(yè)內(nèi)窺鏡使用詳細說明書
評論
0/150
提交評論