Java設(shè)計模式課件-迭代器模式_第1頁
Java設(shè)計模式課件-迭代器模式_第2頁
Java設(shè)計模式課件-迭代器模式_第3頁
Java設(shè)計模式課件-迭代器模式_第4頁
Java設(shè)計模式課件-迭代器模式_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

大綱

迭代器模式概述

迭代器模式的結(jié)構(gòu)與實現(xiàn)

迭代器模式的應(yīng)用實例

使用內(nèi)部類實現(xiàn)迭代器

Java內(nèi)置迭代器

迭代器模式的優(yōu)缺點與適用環(huán)境遙控器迭代器模式概述

電視機遙控器與電視機示意圖迭代器模式概述

分析

電視機存儲電視頻道的集合聚合類(AggregateClasses)

電視機遙控器操作電視頻道迭代器(Iterator)

訪問一個聚合對象中的元素但又不需要暴露它的內(nèi)部結(jié)構(gòu)迭代器模式概述

分析

聚合對象的兩個職責:?存儲數(shù)據(jù),聚合對象的基本職責?遍歷數(shù)據(jù),既是可變化的,又是可分離的

將遍歷數(shù)據(jù)的行為從聚合對象中分離出來,封裝在迭代器對象中

由迭代器來提供遍歷聚合對象內(nèi)部數(shù)據(jù)的行為,簡化聚合對象的設(shè)計,更符合單一職責原則迭代器模式概述

迭代器模式的定義迭代器模式:提供一種方法順序訪問一個聚合對象中各個元素,且不用暴露該對象的內(nèi)部表示。aggregateobjectsequentiallywithoutexposingitsunderlyingrepresentation.IteratorPattern:Provideawaytoaccesstheelementsofanaggregateobjectsequentiallywithoutexposingitsunderlyingrepresentation.

對象行為型模式迭代器模式概述

迭代器模式的定義

又名游標(Cursor)模式

通過引入迭代器,客戶端無須了解聚合對象的內(nèi)部結(jié)構(gòu)即可實現(xiàn)對聚合對象中成員的遍歷,還可以根據(jù)需要很方便地增加新的遍歷方式為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的如果要在迭代器中增加新的方法,則需要修改抽象迭代器在圖中,現(xiàn)給出使用迭代器模式重構(gòu)后的解決方案。+listIterator(intindex):ListIteratorsuper(products);publicclassConcreteIteratorimplementsIterator{++createIterator()ProductList(Listproducts):AbstractIteratorpackagejava.(5)Client:客戶端測試類--cursor1cursor2//商品迭代器:具體迭代器,內(nèi)部類實現(xiàn)persons=newArrayList();//創(chuàng)建一個ArrayList類型的聚合對象super(products);構(gòu)即可實現(xiàn)對聚合對象中成員的遍歷,還可以根據(jù)需又名游標(Cursor)模式迭代器模式的結(jié)構(gòu)與實現(xiàn)

迭代器模式的結(jié)構(gòu)IteratorAggregate+first()++next()hasNext()+currentItem()+createIterator()ConcreteIteratorConcreteAggregate+first()+next()+hasNext()+currentItem()+createIterator()aggregate迭代器模式的結(jié)構(gòu)與實現(xiàn)

迭代器模式的結(jié)構(gòu)

迭代器模式包含以下4個角色:?Iterator(抽象迭代器)?ConcreteIterator(具體迭代器)?Aggregate?ConcreteAggregate(抽象聚合類)(具體聚合類)迭代器模式的結(jié)構(gòu)與實現(xiàn)

迭代器模式的實現(xiàn)

典型的抽象迭代器代碼:publicinterfaceIterator{publicvoidfirst();//將游標指向第一個元素publicvoidnext();//將游標指向下一個元素publicbooleanhasNext();//判斷是否存在下一個元素publicObjectcurrentItem();//獲取游標指向的當前元素}迭代器模式的結(jié)構(gòu)與實現(xiàn)publicclassConcreteIteratorimplementsIterator{

迭代器模式的實現(xiàn)privateConcreteAggregateobjects;//維持一個對具體聚合對象的引用,以便于訪問存儲在聚合對象中的數(shù)據(jù)

privateintcursor;//典型的具體迭代器定義一個游標,用于記錄當前訪問位置代碼:publicConcreteIterator(ConcreteAggregateobjects){this.objects=objects;}publicvoidfirst(){......}publicvoidnext(){......}publicbooleanhasNext(){......}publicObjectcurrentItem(){......}}迭代器模式的結(jié)構(gòu)與實現(xiàn)

迭代器模式的實現(xiàn)

典型的抽象聚合類代碼:publicinterfaceAggregate{IteratorcreateIterator();}迭代器模式的結(jié)構(gòu)與實現(xiàn)

迭代器模式的實現(xiàn)

典型的具體聚合類代碼:publicclassConcreteAggregateimplementsAggregate{......publicIteratorcreateIterator(){returnnewConcreteIterator(this);}......}某軟件公司為某商場開發(fā)了一套銷售管理系統(tǒng),AbstractObjectList類的方法與說明在對該系統(tǒng)進行分析和設(shè)計時,開發(fā)人員發(fā)現(xiàn)經(jīng)常需要對系統(tǒng)中的商品數(shù)據(jù)、客戶數(shù)據(jù)等進行遍歷,為了復用這些遍歷代碼,方法名開發(fā)人員設(shè)計了一個抽象的數(shù)據(jù)集合方法說明類AbstractObjectList迭代器模式的應(yīng)用實例AbstractObjectListaddObject(),將存儲商品和客戶等數(shù)據(jù)的類作為其子類()構(gòu)造方法增加元素,用于給objects對象賦值,AbstractObjectListremoveObject類結(jié)構(gòu)如下圖所示:()刪除元素

實例說明getObjects()獲取所有元素AbstractObjectListisLast()-objects:List<Object>判斷當前元素是否是最后一個元素previous+()AbstractObjectList(ArrayListobjects)移至上一個元素isFirst()+addObject(Objectobj)判斷當前元素是否是第一個元素:voidgetNextItem+removeObject(Objectobj)()獲取下一個元素getPreviousItem+getObjects()()獲取上一個元素+next()AbstractObjectList+isLast()類的子類ProductList和CustomerList:boolean分別用于存儲商品通過分析,發(fā)現(xiàn)+isFirst()AbstractObjectList類的職責非常重,:boolean它既負責存儲和管next()移至下一個元素{abstract}:void:List:void數(shù)據(jù)和客戶數(shù)據(jù)+。previous()理數(shù)據(jù),又負責遍歷數(shù)據(jù),違背了單一職責原則,+getNextItem():Object實現(xiàn)代碼將非常復雜。:void因此,開發(fā)人員決定使用迭代器模式對+getPreviousItem()AbstractObjectList:Object類進行重構(gòu),將負責遍歷數(shù)據(jù)的方法提取出來,封裝到專門的類中,實現(xiàn)數(shù)據(jù)存儲和數(shù)據(jù)遍歷分離,還可以給不同的具體數(shù)據(jù)集合類提供不同的遍歷方式。AbstractObjectList類結(jié)構(gòu)圖示:在圖中,現(xiàn)給出使用迭代器模式重構(gòu)后的解決方案。List類型的對象objects用于存儲數(shù)據(jù),其方法與說明如下表所迭代器模式的應(yīng)用實例AbstractIterator

實例類圖AbstractObjectList{abstract}+next()+isLast()+previous()++isFirst()getNextItem()+getPreviousItem():Object:void:boolean:void:boolean:Object#objects++AbstractObjectList(Listobjects)addObject(Objectobj):void+removeObject(Objectobj)++getObjects()createIterator():List<Object>:void:List:AbstractIteratorProductIterator--productListproducts:ProductList:List--cursor1cursor2++ProductIterator(ProductListlist)next():void+isLast()++previous()isFirst()++getNextItem()getPreviousItem()ProductList:int:int++createIterator()ProductList(Listproducts):AbstractIterator:boolean:void:boolean:Object:Object銷售管理系統(tǒng)數(shù)據(jù)遍歷結(jié)構(gòu)圖迭代器模式的應(yīng)用實例

實例代碼

(1)AbstractObjectList:抽象聚合類

(2)ProductList:商品數(shù)據(jù)類,充當具體聚合類

(3)AbstractIterator:抽象迭代器

(4)ProductIterator:商品迭代器,充當具體迭代器

(5)Client:客戶端測試類演示……Code(designpatterns.iterator)迭代器模式的應(yīng)用實例

結(jié)果及分析

如果需要增加一個新的具體聚合類,只需增加一個新的聚合子類和一個新的具體迭代器類即可,原有類庫代碼無須修改,符合開閉原則

如果需要更換一個迭代器,只需要增加一個新的具體迭代器類作為抽象迭代器類的子類,重新實現(xiàn)遍歷方法即可,原有迭代器代碼無須修改,也符合開閉原則

如果要在迭代器中增加新的方法,則需要修改抽象迭代器的源代碼,這將違背開閉原則使用內(nèi)部類實現(xiàn)迭代器

實現(xiàn)

JDK中的AbstractListpackagejava.util;……publicabstractclassAbstractList<E>extendsAbstractCollection<E>implementsList<E>{......privateclassItrimplementsIterator<E>{intcursor=0;......}……}使用內(nèi)部類實現(xiàn)迭代器

//public使用內(nèi)部類實現(xiàn)的商品數(shù)據(jù)類實現(xiàn)classProductListextendsAbstractObjectList{publicProductList(Listproducts){

JDK中的AbstractListsuper(products);}publicAbstractIteratorcreateIterator(){returnnewProductIterator();}//商品迭代器:具體迭代器,內(nèi)部類實現(xiàn)privateclassProductIteratorimplementsAbstractIterator{privateintcursor1;privateintcursor2;//省略其他代碼}}Java內(nèi)置迭代器

結(jié)構(gòu)CollectionIterator+iterator():IteratorListListIterator++iterator()listIterator()+listIterator(intindex):ListIterator:Iterator:ListIteratorAbstractListAbstractSequentialListLinkedListListItr++Iterator()listIterator()+listIterator(intindex):ListIterator:Iterator:ListIterator+Iterator()+listIterator(intindex):ListIterator:Iterator+listIterator(intindex):ListIteratorJava內(nèi)置迭代器

實現(xiàn)

packagejava.util;publicinterfaceCollection<E>extendsIterable<E>{……booleanadd(Objectc);booleanaddAll(Collectionc);booleanremove(Objecto);booleanremoveAll(Collectionc);booleanremainAll(Collectionc);Iteratoriterator();……}Java內(nèi)置迭代器

實現(xiàn)

packagejava.util;publicinterfaceIterator<E>{booleanhasNext();Enext();voidremove();}importjava.util.*;publicclassIteratorDemo{publicstaticvoidprocess(Collectionc){Iteratori=c.iterator();//Java內(nèi)置迭代器創(chuàng)建迭代器對象//通過迭代器遍歷聚合對象while(i.hasNext()){

應(yīng)用System.out.println(i.next().toStr

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論