Java设计模式课件-迭代器模式_第1页
Java设计模式课件-迭代器模式_第2页
Java设计模式课件-迭代器模式_第3页
Java设计模式课件-迭代器模式_第4页
Java设计模式课件-迭代器模式_第5页
已阅读5页,还剩21页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大纲

迭代器模式概述

迭代器模式的结构与实现

迭代器模式的应用实例

使用内部类实现迭代器

Java内置迭代器

迭代器模式的优缺点与适用环境遥控器迭代器模式概述

电视机遥控器与电视机示意图迭代器模式概述

分析

电视机存储电视频道的集合聚合类(AggregateClasses)

电视机遥控器操作电视频道迭代器(Iterator)

访问一个聚合对象中的元素但又不需要暴露它的内部结构迭代器模式概述

分析

聚合对象的两个职责:•存储数据,聚合对象的基本职责•遍历数据,既是可变化的,又是可分离的

将遍历数据的行为从聚合对象中分离出来,封装在迭代器对象中

由迭代器来提供遍历聚合对象内部数据的行为,简化聚合对象的设计,更符合单一职责原则迭代器模式概述

迭代器模式的定义迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,且不用暴露该对象的内部表示。aggregateobjectsequentiallywithoutexposingitsunderlyingrepresentation.IteratorPattern:Provideawaytoaccesstheelementsofanaggregateobjectsequentiallywithoutexposingitsunderlyingrepresentation.

对象行为型模式迭代器模式概述

迭代器模式的定义

又名游标(Cursor)模式

通过引入迭代器,客户端无须了解聚合对象的内部结构即可实现对聚合对象中成员的遍历,还可以根据需要很方便地增加新的遍历方式为遍历不同的聚合结构提供一个统一的如果要在迭代器中增加新的方法,则需要修改抽象迭代器在图中,现给出使用迭代器模式重构后的解决方案。+listIterator(intindex):ListIteratorsuper(products);publicclassConcreteIteratorimplementsIterator{++createIterator()ProductList(Listproducts):AbstractIteratorpackagejava.(5)Client:客户端测试类--cursor1cursor2//商品迭代器:具体迭代器,内部类实现persons=newArrayList();//创建一个ArrayList类型的聚合对象super(products);构即可实现对聚合对象中成员的遍历,还可以根据需又名游标(Cursor)模式迭代器模式的结构与实现

迭代器模式的结构IteratorAggregate+first()++next()hasNext()+currentItem()+createIterator()ConcreteIteratorConcreteAggregate+first()+next()+hasNext()+currentItem()+createIterator()aggregate迭代器模式的结构与实现

迭代器模式的结构

迭代器模式包含以下4个角色:•Iterator(抽象迭代器)•ConcreteIterator(具体迭代器)•Aggregate•ConcreteAggregate(抽象聚合类)(具体聚合类)迭代器模式的结构与实现

迭代器模式的实现

典型的抽象迭代器代码:publicinterfaceIterator{publicvoidfirst();//将游标指向第一个元素publicvoidnext();//将游标指向下一个元素publicbooleanhasNext();//判断是否存在下一个元素publicObjectcurrentItem();//获取游标指向的当前元素}迭代器模式的结构与实现publicclassConcreteIteratorimplementsIterator{

迭代器模式的实现privateConcreteAggregateobjects;//维持一个对具体聚合对象的引用,以便于访问存储在聚合对象中的数据

privateintcursor;//典型的具体迭代器定义一个游标,用于记录当前访问位置代码:publicConcreteIterator(ConcreteAggregateobjects){this.objects=objects;}publicvoidfirst(){......}publicvoidnext(){......}publicbooleanhasNext(){......}publicObjectcurrentItem(){......}}迭代器模式的结构与实现

迭代器模式的实现

典型的抽象聚合类代码:publicinterfaceAggregate{IteratorcreateIterator();}迭代器模式的结构与实现

迭代器模式的实现

典型的具体聚合类代码:publicclassConcreteAggregateimplementsAggregate{......publicIteratorcreateIterator(){returnnewConcreteIterator(this);}......}某软件公司为某商场开发了一套销售管理系统,AbstractObjectList类的方法与说明在对该系统进行分析和设计时,开发人员发现经常需要对系统中的商品数据、客户数据等进行遍历,为了复用这些遍历代码,方法名开发人员设计了一个抽象的数据集合方法说明类AbstractObjectList迭代器模式的应用实例AbstractObjectListaddObject(),将存储商品和客户等数据的类作为其子类()构造方法增加元素,用于给objects对象赋值,AbstractObjectListremoveObject类结构如下图所示:()删除元素

实例说明getObjects()获取所有元素AbstractObjectListisLast()-objects:List<Object>判断当前元素是否是最后一个元素previous+()AbstractObjectList(ArrayListobjects)移至上一个元素isFirst()+addObject(Objectobj)判断当前元素是否是第一个元素:voidgetNextItem+removeObject(Objectobj)()获取下一个元素getPreviousItem+getObjects()()获取上一个元素+next()AbstractObjectList+isLast()类的子类ProductList和CustomerList:boolean分别用于存储商品通过分析,发现+isFirst()AbstractObjectList类的职责非常重,:boolean它既负责存储和管next()移至下一个元素{abstract}:void:List:void数据和客户数据+。previous()理数据,又负责遍历数据,违背了单一职责原则,+getNextItem():Object实现代码将非常复杂。:void因此,开发人员决定使用迭代器模式对+getPreviousItem()AbstractObjectList:Object类进行重构,将负责遍历数据的方法提取出来,封装到专门的类中,实现数据存储和数据遍历分离,还可以给不同的具体数据集合类提供不同的遍历方式。AbstractObjectList类结构图示:在图中,现给出使用迭代器模式重构后的解决方案。List类型的对象objects用于存储数据,其方法与说明如下表所迭代器模式的应用实例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销售管理系统数据遍历结构图迭代器模式的应用实例

实例代码

(1)AbstractObjectList:抽象聚合类

(2)ProductList:商品数据类,充当具体聚合类

(3)AbstractIterator:抽象迭代器

(4)ProductIterator:商品迭代器,充当具体迭代器

(5)Client:客户端测试类演示……Code(designpatterns.iterator)迭代器模式的应用实例

结果及分析

如果需要增加一个新的具体聚合类,只需增加一个新的聚合子类和一个新的具体迭代器类即可,原有类库代码无须修改,符合开闭原则

如果需要更换一个迭代器,只需要增加一个新的具体迭代器类作为抽象迭代器类的子类,重新实现遍历方法即可,原有迭代器代码无须修改,也符合开闭原则

如果要在迭代器中增加新的方法,则需要修改抽象迭代器的源代码,这将违背开闭原则使用内部类实现迭代器

实现

JDK中的AbstractListpackagejava.util;……publicabstractclassAbstractList<E>extendsAbstractCollection<E>implementsList<E>{......privateclassItrimplementsIterator<E>{intcursor=0;......}……}使用内部类实现迭代器

//public使用内部类实现的商品数据类实现classProductListextendsAbstractObjectList{publicProductList(Listproducts){

JDK中的AbstractListsuper(products);}publicAbstractIteratorcreateIterator(){returnnewProductIterator();}//商品迭代器:具体迭代器,内部类实现privateclassProductIteratorimplementsAbstractIterator{privateintcursor1;privateintcursor2;//省略其他代码}}Java内置迭代器

结构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内置迭代器

实现

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

实现

packagejava.util;publicinterfaceIterator<E>{booleanhasNext();Enext();voidremove();}importjava.util.*;publicclassIteratorDemo{publicstaticvoidprocess(Collectionc){Iteratori=c.iterator();//Java内置迭代器创建迭代器对象//通过迭代器遍历聚合对象while(i.hasNext()){

应用System.out.println(i.next().toStr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论