第20章 迭代器模式_第1頁
第20章 迭代器模式_第2頁
第20章 迭代器模式_第3頁
第20章 迭代器模式_第4頁
第20章 迭代器模式_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第20章迭代器模式 本章教學(xué)內(nèi)容w 迭代器模式 模式動(dòng)機(jī)與定義模式動(dòng)機(jī)與定義 模式結(jié)構(gòu)與分析模式結(jié)構(gòu)與分析 模式實(shí)例與解析模式實(shí)例與解析 模式效果與應(yīng)用模式效果與應(yīng)用 模式擴(kuò)展模式擴(kuò)展迭代器模式w 模式動(dòng)機(jī) 一個(gè)聚合對(duì)象,如一個(gè)列表一個(gè)聚合對(duì)象,如一個(gè)列表(List)或者一個(gè)集合或者一個(gè)集合(Set),應(yīng)該,應(yīng)該提供一種方法來讓別人可以訪問它的元素,而又不需要暴露提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內(nèi)部結(jié)構(gòu)它的內(nèi)部結(jié)構(gòu)。 針對(duì)不同的需要,可能還要針對(duì)不同的需要,可能還要以不同的方式遍歷整個(gè)聚合對(duì)象以不同的方式遍歷整個(gè)聚合對(duì)象,但是我們但是我們并不希望在聚合對(duì)象的抽象層接口中

2、充斥著各種不并不希望在聚合對(duì)象的抽象層接口中充斥著各種不同遍歷的操作同遍歷的操作。 怎樣遍歷一個(gè)聚合對(duì)象,又不需要了解聚合對(duì)象的內(nèi)部結(jié)構(gòu),怎樣遍歷一個(gè)聚合對(duì)象,又不需要了解聚合對(duì)象的內(nèi)部結(jié)構(gòu),還能夠提供多種不同的遍歷方式,這就是迭代器模式所要解還能夠提供多種不同的遍歷方式,這就是迭代器模式所要解決的問題。決的問題。迭代器模式w模式動(dòng)機(jī)迭代器模式w模式動(dòng)機(jī)在迭代器模式中,提供一個(gè)在迭代器模式中,提供一個(gè)外部的迭代器外部的迭代器來對(duì)聚合對(duì)象來對(duì)聚合對(duì)象進(jìn)行訪問和遍歷,進(jìn)行訪問和遍歷,迭代器定義了一個(gè)訪問該聚合元素的迭代器定義了一個(gè)訪問該聚合元素的接口接口,并且可以跟蹤當(dāng)前遍歷的元素并且可以跟蹤當(dāng)前

3、遍歷的元素,了解哪些元素已了解哪些元素已經(jīng)遍歷過而哪些沒有經(jīng)遍歷過而哪些沒有。有了迭代器模式,我們會(huì)發(fā)現(xiàn)對(duì)一個(gè)復(fù)雜的聚合對(duì)象的有了迭代器模式,我們會(huì)發(fā)現(xiàn)對(duì)一個(gè)復(fù)雜的聚合對(duì)象的操作會(huì)變得如此簡單。操作會(huì)變得如此簡單。迭代器模式w 模式定義迭代器模式迭代器模式(Iterator Pattern) :提供一種方法來:提供一種方法來訪問訪問聚合對(duì)象聚合對(duì)象,而,而不用暴露這個(gè)對(duì)象的內(nèi)部表示不用暴露這個(gè)對(duì)象的內(nèi)部表示,其別名為,其別名為游標(biāo)游標(biāo)(Cursor)。迭代器模式是一種。迭代器模式是一種對(duì)象行為型對(duì)象行為型模式。模式。迭代器模式w 模式定義Iterator Pattern: Provide a

4、way to access the elements of an aggregate object sequentially without exposing its underlying representation. Frequency of use: high 迭代器模式w 模式結(jié)構(gòu)ConcreteAggregate+ createIterator ().Aggregate+ createIterator ()ConcreteIterator+first ()next ()hasNext ()currentItem ()Iterator+first ()next ()hasNext ()

5、currentItem ()迭代器模式w 模式結(jié)構(gòu)迭代器模式包含如下角色:迭代器模式包含如下角色: Iterator: 抽象迭代器 ConcreteIterator: 具體迭代器 Aggregate: 抽象聚合類 ConcreteAggregate: 具體聚合類迭代器模式w 模式分析 聚合是一個(gè)聚合是一個(gè)管理和組織數(shù)據(jù)對(duì)象管理和組織數(shù)據(jù)對(duì)象的數(shù)據(jù)結(jié)構(gòu)。的數(shù)據(jù)結(jié)構(gòu)。 聚合對(duì)象主要擁有兩個(gè)職責(zé):一是聚合對(duì)象主要擁有兩個(gè)職責(zé):一是存儲(chǔ)內(nèi)部數(shù)據(jù)存儲(chǔ)內(nèi)部數(shù)據(jù);二是;二是遍遍歷內(nèi)部數(shù)據(jù)歷內(nèi)部數(shù)據(jù)。 存儲(chǔ)數(shù)據(jù)存儲(chǔ)數(shù)據(jù)是聚合對(duì)象最基本的職責(zé)。是聚合對(duì)象最基本的職責(zé)。 將將遍歷聚合對(duì)象中數(shù)據(jù)的行為提取出來遍歷聚

6、合對(duì)象中數(shù)據(jù)的行為提取出來,封裝到一個(gè)迭代封裝到一個(gè)迭代器中器中,通過專門的迭代器來遍歷聚合對(duì)象的內(nèi)部數(shù)據(jù),這,通過專門的迭代器來遍歷聚合對(duì)象的內(nèi)部數(shù)據(jù),這就是迭代器模式的本質(zhì)。迭代器模式是就是迭代器模式的本質(zhì)。迭代器模式是“單一職責(zé)原則單一職責(zé)原則”的完美體現(xiàn)。的完美體現(xiàn)。 迭代器模式w 模式分析自定義迭代器自定義迭代器 MyIterator抽象迭代器 MyCollection抽象聚合類 NewCollection具體聚合類 NewIterator具體迭代器 Client 迭代器模式w 模式分析自定義迭代器自定義迭代器 參考代碼 (Chapter 20 IteratorSimpleItera

7、tor)演示演示迭代器模式w 模式分析迭代器模式常規(guī)實(shí)現(xiàn)代碼:迭代器模式常規(guī)實(shí)現(xiàn)代碼:public class ConcreteIterator implements Iteratorprivate ConcreteAggregate objects;public ConcreteIterator(ConcreteAggregate objects)this.objects=objects;public void first() . public void next() . public boolean hasNext() . public Object currentItem() . pub

8、lic class ConcreteAggregate implements Aggregate .public Iterator createIterator()return new ConcreteIterator(this);.迭代器模式w 模式分析 在迭代器模式中應(yīng)用了在迭代器模式中應(yīng)用了工廠方法模式工廠方法模式,聚合類充當(dāng)工廠類聚合類充當(dāng)工廠類,而而迭代器充當(dāng)產(chǎn)品類迭代器充當(dāng)產(chǎn)品類,由于定義了抽象層,系統(tǒng)的擴(kuò)展性,由于定義了抽象層,系統(tǒng)的擴(kuò)展性很好,在客戶端可以針對(duì)抽象聚合類和抽象迭代器進(jìn)行編很好,在客戶端可以針對(duì)抽象聚合類和抽象迭代器進(jìn)行編程。程。 由于很多編程語言的類庫都已經(jīng)實(shí)現(xiàn)

9、了迭代器模式,因此由于很多編程語言的類庫都已經(jīng)實(shí)現(xiàn)了迭代器模式,因此在實(shí)際使用中我們很少自定義迭代器,只需要直接使用在實(shí)際使用中我們很少自定義迭代器,只需要直接使用Java、C#等語言中已定義好的迭代器即可,等語言中已定義好的迭代器即可,迭代器已經(jīng)迭代器已經(jīng)成為我們操作聚合對(duì)象的基本工具之一成為我們操作聚合對(duì)象的基本工具之一。迭代器模式w 迭代器模式實(shí)例與解析實(shí)例:電視機(jī)遙控器實(shí)例:電視機(jī)遙控器 電視機(jī)遙控器就是一個(gè)迭代器的實(shí)例,通過它可以實(shí)現(xiàn)對(duì)電視機(jī)頻道集合的遍歷操作,本實(shí)例我們將模擬電視機(jī)遙控器的實(shí)現(xiàn)。 迭代器模式w 迭代器模式實(shí)例與解析實(shí)例:電視機(jī)遙控器實(shí)例:電視機(jī)遙控器 迭代器模式w

10、迭代器模式實(shí)例與解析實(shí)例:電視機(jī)遙控器實(shí)例:電視機(jī)遙控器 參考代碼 (Chapter 20 Iteratorsample01)演示演示迭代器模式w 模式優(yōu)缺點(diǎn)迭代器模式的優(yōu)點(diǎn)迭代器模式的優(yōu)點(diǎn) 它支持以不同的方式遍歷一個(gè)聚合對(duì)象。 迭代器簡化了聚合類。 在同一個(gè)聚合上可以有多個(gè)遍歷。 在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有代碼,滿足“開閉原則”的要求。迭代器模式w 模式優(yōu)缺點(diǎn)迭代器模式的缺點(diǎn)迭代器模式的缺點(diǎn) 由于迭代器模式將存儲(chǔ)數(shù)據(jù)和遍歷數(shù)據(jù)的職責(zé)分離,增加新的聚合類需要對(duì)應(yīng)增加新的迭代器類,類的個(gè)數(shù)成對(duì)增加,這在一定程度上增加了系統(tǒng)的復(fù)雜性。迭代器模式w 模式適用環(huán)境在

11、以下情況下可以使用迭代器模式:在以下情況下可以使用迭代器模式: 訪問一個(gè)聚合對(duì)象的內(nèi)容而無須暴露它的內(nèi)部表示。 需要為聚合對(duì)象提供多種遍歷方式。 為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口。迭代器模式w 模式應(yīng)用JDK 1.2 引入了新的引入了新的Java聚合框架聚合框架Collections。 CollectionSetListSortedSetMapSortedMap迭代器模式w 模式應(yīng)用Collection是所有是所有Java聚合類的根接口。聚合類的根接口。在在JDK類庫中,類庫中,Collection的的iterator()方法返回一個(gè)方法返回一個(gè)java.util.Iterator類型的

12、對(duì)象類型的對(duì)象,而其子接口,而其子接口java.util.List的的listIterator()方法返回一個(gè)方法返回一個(gè)java.util.ListIterator類型的對(duì)象,類型的對(duì)象,ListIterator是是Iterator的子類的子類。它們構(gòu)成了。它們構(gòu)成了Java語言對(duì)迭代器模式語言對(duì)迭代器模式的支持,的支持,Java語言的語言的java.util.Iterator接口就是迭代接口就是迭代器模式的應(yīng)用。器模式的應(yīng)用。 迭代器模式w 模式應(yīng)用Java內(nèi)置迭代器內(nèi)置迭代器 參考代碼 (Chapter 20 IteratorJavaIterator)演示演示迭代器模式w 模式擴(kuò)展Jav

13、a迭代器迭代器 在JDK中,Iterator接口具有如下3個(gè)基本方法:(1) Object next():通過反復(fù)調(diào)用next()方法可以逐個(gè)訪問聚合中的元素。(2) boolean hasNext():hasNext()方法用于判斷聚合對(duì)象中是否還存在下一個(gè)元素,為了不拋出異常,必須在調(diào)用next()之前先調(diào)用hasNext()。如果迭代對(duì)象仍然擁有可供訪問的元素,那么hasNext()返回true。(3) void remove():用于刪除上次調(diào)用next()時(shí)所返回的元素。 迭代器模式w 模式擴(kuò)展Java迭代器迭代器 Java迭代器可以理解為它工作在聚合對(duì)象的各個(gè)元素之間,每調(diào)用一次n

14、ext()方法,迭代器便越過下個(gè)元素,并且返回它剛越過的那個(gè)元素的地址引用。但是,它也有一些限制,如某些迭代器只能單向移動(dòng)。在使用迭代器時(shí),訪問某個(gè)元素的唯一方法就是調(diào)用next()。迭代器模式w 模式擴(kuò)展Java迭代器迭代器 代碼示例:Iterator iterator = collection.iterator(); /collection是已實(shí)例化的集合對(duì)象iterator.next(); / 跳過第一個(gè)元素iterator.remove(); / 刪除第一個(gè)元素iterator.remove();iterator.next(); /該語句不能去掉iterator.remove(); 本

15、章小結(jié)w 迭代器模式提供一種方法來訪問聚合對(duì)象,而不用暴露這個(gè)對(duì)象的內(nèi)部表示,其別名為游標(biāo)。迭代器模式是一種對(duì)象行為型模式。w 迭代器模式包含四個(gè)角色:抽象迭代器定義了訪問和遍歷元素的接口;具體迭代器實(shí)現(xiàn)了抽象迭代器接口,完成對(duì)聚合對(duì)象的遍歷;抽象聚合類用于存儲(chǔ)對(duì)象,并定義創(chuàng)建相應(yīng)迭代器對(duì)象的接口;具體聚合類實(shí)現(xiàn)了創(chuàng)建相應(yīng)迭代器的接口。w 將遍歷聚合對(duì)象中數(shù)據(jù)的行為提取出來,封裝到一個(gè)迭代器中,通過專門的迭代器來遍歷聚合對(duì)象的內(nèi)部數(shù)據(jù),這就是迭代器模式的本質(zhì)。迭代器模式是“單一職責(zé)原則”的完美體現(xiàn)。本章小結(jié)w 迭代器模式的主要優(yōu)點(diǎn)在于它支持以不同的方式遍歷一個(gè)聚合對(duì)象,還簡化了聚合類,而且在同一個(gè)聚合上可以有多個(gè)遍歷;其缺點(diǎn)在于增加新的聚合類需要對(duì)應(yīng)增加新的迭代器類,類的個(gè)數(shù)成對(duì)增加,這在一定程度上增加了系統(tǒng)的復(fù)雜性。w 迭代器模

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論