迭代器模式实验(含答案)_第1页
迭代器模式实验(含答案)_第2页
迭代器模式实验(含答案)_第3页
迭代器模式实验(含答案)_第4页
迭代器模式实验(含答案)_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

课程名称:软件体系结构与设计迭代器(Iterator)模式实验一、 实验目的掌握迭代器模式的概念;掌握迭代器模式的功能;加深对迭代器模式的了解;提高对迭代器模式的运用;将该模式运用但实际的生活中。二、 实验容阅读和查看资料了解迭代器模式的概念和功能;将有关代理模式的迭代器模式理解透彻并运行;举例说明生活中的一个可以使用迭代器模式的例子;熟悉迭代器模式的扩展,迭代器模式是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构。三、 实验环境Windows7、Java虚拟机、MyEclipse环境下运行代码。四、 实验设计原理迭代器(Iterator)模式,又叫做游标(Cursor)模式。它提供一种方法顺序访问一个聚合对象(或容器对象:container)中各个元素,而又不需暴露该对象的部。聚合:表示一组对象的组合结构,比如JAVA中的数组,集合等从定义可见,迭代器模式是为容器而生。很明显,对容器对象的访问必然

涉与到遍历算法。你可以一股脑的将遍历方法塞到容器对象中去;或者根本不去提供什么遍历算法,让使用容器的人自己去实现去吧。这两种情况好像都能够解决问题。然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。第二种方式倒是省事,却又将容器的部细节暴露无遗。而迭代器模式的出现,很好的解决了上面两种情况的弊端。迭代器模式的类图如下图所示: K I迭代抽象类「用于定熨猖到开始对象、得到下一于对象7廩集抽象类 j 判断是否到结尾,当前对壕抽象方法,统1接口IteratorAggregate-+Createlter^tor():IteratorClient4+First()Aggregate-+Createlter^tor():IteratorClient4+LJext()+IsDone()+Currentltem()ConcreteiteratorConcreteAggregateConcreteiterator+Createlterator():Iterator具祥聚集裘,继承旳grepte~~具傑迭代器类■继literati实现开嫦具祥聚集裘,继承旳grepte~~类图解读:从结构上可以看出,迭代器模式在客户与容器之间加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器部细节的暴露,而且也使得设计符号“单一职责原则”。注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的一一遍历算法是与容器的部细节紧密相关的。为了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更具一般性和重用性。这被称为多态迭代。迭代器模式所涉与的角色有:参与者:•迭代器角色(Iterator):定义访问和遍历元素的接口。•具体迭代器角色(ConcreteIterator):关联到被迭代的具体聚集对象角色,继承迭代器角色实现具体的迭代,并负责管理记录遍历中的当前位置。•聚集对象抽象角色(Aggregate):负责提供创建具体迭代器角色的接口。•具体聚集对象角色(ConcreteAggreate):持有一个对象的集合,实现创建具体迭代器角色的接口,返回集合遍历所依赖的一个迭代器。一个迭代器模式例子:20世纪80年代的黑白电视机,没有遥控器,每次开关机或者换台都需要通过电视机上面的那些按钮来完成,如果你想换台的话,需要亲自用手去旋转换台的按钮,每转一下就“啪”的响一声,如果没有收到任何电视频道就会出现一片让人眼花的雪花点。还

要移动电视机上面那两根可以前后左右移动变长变短的天线。随着科技的飞速发展,越来越高级的电视机相继出现,那种古老的电视机几乎看不到了。与那时的电视机相比,现今的电视机给我们带来的最大便利之一就是增加了电视机遥控器,我们在进行开机、关机、换台、改变音量等操作时都无须直接操作电视机,可以通过遥控器来间接实现。我们可以将电视机看成一个存储电视频道的集合对象,通过遥控器可以对电视机中的电视频道集合进行操作,如返回上一个频道、跳转到下一个频道或者跳转至指定的频道。遥控器为我们操作电视频道带来很大的方便,用户并不需要知道这些频道到底如何存储在电视机中。电视机遥控器和电视机示意图如图1所示:电视机遥控器 电视机〔电视频道的集合)在软件开发中,也存在大量类似电视机一样的类,它们可以存储多个成员对象(元素),这些类通常称为聚合类(AggregateClasses),对应的对象称为聚合对象。为了更加方便地操作这些聚合对象,同时可以很灵活地为聚合对象增加不同的遍历方法,我们也需要类似电视机遥控器一样的角色,可以访问一个聚合对象中的元素但又不需要暴露它的部结构。本章我们将要学习的迭代器模式将为聚合对象提供一个遥控器,通过引入迭代器,客户端无须了解聚合对象的部结构即可实现对聚合对象中成员的遍历,还可以根据需要很方便地增加新的遍历方式。•迭代器模式的作用:•迭代器模式能够遍历一组聚合对象,不需要了解其部结构还能提供不同的遍历方法。•就是分离了集合对象的遍历行为,将遍历算法交给这个迭代器角色来完成,可以很好的避免容器部细节的暴露,而且也使得设计符合“单一职责原则”另外迭代器模式抽象了具体迭代器角色,可以通过对一个抽象迭代器多个集成可来完成同一聚集对象的多种遍历。五、迭代器模式示例性代码首先有一个抽象的聚集,所谓的聚集就是就是数据的集合,可以循环去访问它。它只有一个方法Getlterator()让子类去实现,用来获得一个迭代器对象。///vsummary>23///抽象聚集5///v/summary>7publicinterfaceIList9{IIteratorGetlterator();}抽象的迭代器,它是用来访问聚集的类,封装了一些方法,用来把聚集中的数据按顺序读取出来。通常会有MoveNext()、Currentltem()、Fisrt()、Next()等几个方法让子类去实现。1///vsummary>23///抽象迭代器45///</summary>67publicinterfaceIlterator{boolMoveNext();1011ObjectCurrentltem();1213voidFirst();1415voidNext();16}具体的聚集,它实现了抽象聚集中的唯一的方法,同时在里面保存了一组数据,这里我们加上Length属性和GetElement()方法是为了便于访问聚集中的数据。1///vsummary>23///具体聚集45///v/summary>67publicclassConcreteList:IList8{int[]list;11 publicConcreteList()TOC\o"1-5"\h\z13 {list=newint[]{1,2,3,4,5};}17 publicIlteratorGetIterator()1819 {returnnewConcretelterator(this);}23 publicintLength2425 {get{returnlist.Length; }}29 publicintGetElement(intindex)3031 {returnlist[index];

4681011131517182021232526283233353738394143444547495052}34}具体迭代器,实现了抽象迭代器中的四个方法,在它的构造函数中需要接受一个具体聚集类型的参数,在这里面我们可以根据实际的情况去编写不同的迭代方式。1/**////vsummary>23///具体迭代器///v/summary>publicclassConcretelterator:【Iterator9{privateConcreteListlist;12privateintindex;14publicConcreteIterator(ConcreteListlist)16{this.list=list;19 index=0;}22publicboolMoveNext()24 {if(indexvlist.Length)27 returntrue;else3031 returnfalse;}publicObjectCurrentItem()TOC\o"1-5"\h\z36 {returnlist.GetElement(index);}40publicvoidFirst()42 {index=0;}46publicvoidNext()48 {if(indexvlist.Length)51 {index++;

53}}简单的客户端程序调用:1/**////vsummary>23///客户端程序45///v/summary>7classProgram9{staticvoidMain(string[]args)1112{13IIteratoriterator;1415IListlist=newConcreteList();1617iterator=list.GetIterator();1819while(iterator.MoveNext())2021{22inti=(int)iterator.Currentltem();23Console.WriteLine(i.ToString());2425iterator.Next();26}2728Console.Read();2930}3132}Iterator实现要点:1•迭代抽象:访问一个聚合对象的容而无需暴露它的部表示。2•迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。3•迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。题目:假设某软件公司Z为某超市开发了一套销售管理系统,在对该系统进行分析和设计时,Z公司开发人员发现经常需要对系统中的商品数据、客户数据等进行遍历,为了复用这些遍历代码,z公司开发

人员设计了一个抽象的数据聚合类AbstractObjectList,而将存储商品和客户登记的类作为其子类。AbstractObjectList类结构如下图所示。AbstractObjectList-objects:IList<Dbject>-t-AbstractObjeutLisHILktccibjEiztAobjent)-t-AddObject(objectobj)-t-RemoveObjecttobjectobj)-t-GetObjectsO-t-Nextfl-t-IsLa5tO-t-PreviousO+IsFirstQ-t-GetNextltemO-t-GetPreviousItemO在上图中,IList类型的对象objects用于存储数据,AbstractObjectList类的方法说明如下表所示:方法名方袪说明Ab^trartOhjcctlasl()构造方1法,用于给objects对象赋值addCJLjcclC>增加元素rcmyveObjectC)洲除元素gelObjectsO疲敢所有元藏nextO移至下一个元素i各LastC)判断当前元素區否足最百•牛元欢prevjousO移至上一4*■元素isFIrstO判撕当前元累是否是第一个元索KetNcxt[icm()我取下一个元素getPrevia□silem()錶取上一个元索AbstractObjectList类的子类ProductList和CustomerList分别用于存储商品数据和客户数据。请用迭代器模式编程实现。

代码:importjava.util.*;//抽象聚合类abstractclassAbstractobjectList{protectedList<Object>objects=newArrayList<Object>();publicAbstractObjectList(Listobjects){this.objects=objects;}publicvoidaddObject(Objectobj){this.objects.add(obj);}publicvoidremoveObject(Objectobj){this.objects.remove(obj);}publicListgetObjects(){returnthis.objects;}//声明创建迭代器对象的抽象工厂方法publicabstractAbstractIteratorcreateIterator();}//商品数据类:具体聚合类classProductListextendsAbstractObjectList{publicProductList(Listproducts){super(products);}//实现创建迭代器对象的具体工厂方法publicAbstractIteratorcreateIterator(){returnnewProductIterator(this);}}//客户数据类:具体聚合类classCustomerListextendsAbstractObjectList{publicCustomerList(Listcustomers){super(customers);}//实现创建迭代器对象的具体工厂方法publicAbstractiteratorcreatelterator(){returnnewCustomerlterator(this);}}//抽象迭代器interfaceAbstractiterator{publicvoidnext();//移至下一个元素publicbooleanisLast();//判断是否为最后一个元素publicvoidprevious。;//移至上一个元素publicbooleanisFirst();//判断是否为第一个元素publicObjectgetNextItem();//获取下一个元素publicObjectgetPreviousItem();//获取上一个元素}//商品迭代器:具体迭代器classProductIteratorimplementsAbstractIterator{privateProductListproductList;privateListproducts;privateintcursor1;//定义一个游标,用于记录正向遍历的位置privateintcursor2;//定义一个游标,用于记录逆向遍历的位置publicProductIterator(ProductListlist){ductList=list;ducts=list.getObjects();//获取集合对象cursor1=0;//设置正向遍历游标的初始值cursor2=products.size()-1;//设置逆向遍历游标的初始值}publicvoidnext() {if(cursor1<products.size()){cursor1++;}}publicbooleanisLast() {return(cursor1==products.size());}publicvoidprevious(){if(cursor2>-1) {cursor2--;publicbooleanisFirst() {return(cursor2==-1);}publicObjectgetNextitem(){returnproducts.get(cursorl);}publicObjectgetPreviousItem(){returnproducts.get(cursor2);}}//客户迭代器:具体迭代器classCustomerIteratorimplementsAbstractIterator{privateCustomerListcustomerList;privateListcustomers;privateintcursor1;//定义一个游标,用于记录正向遍历的位置privateintcursor2;//定义一个游标,用于记录逆向遍历的位置publicCustomerIterator(CustomerListlist){this.customerList=list;this.customers=list.getobjects();//获取集合对象cursor1=0;//设置正向遍历游标的初始值cursor2=customers.size()-1;//设置逆向遍历游标的初始值}publicvoidnext() {if(cursor1<customers.size()){cursor1++;}}publicbooleanisLast() {return(cursor1==customers.size());}publicvoidprevious(){if(cursor2>-1) {cursor2--;}}publicbooleanisFirst() {return(cursor2==-1);}publicObjectgetNextitem(){returncustomers.get(cursorl);}publicObjectgetPreviousItem(){returncustomers.get(cursor2);}}publicclassIterator{publicstaticvoidmain(Stringargs[]) {List<String>products=newArrayList<String>();products.add("农夫山泉");products.add("百岁山");products.add("康师傅");products.add("旺仔");products.add("统一");AbstractObjectListlist;AbstractIteratoriterator;list=newProductList(products);//仓【J建聚合对象iterator=list.createIterator(); //仓【J建迭代器对象System.out.println("***************商品数据***************");System.out.pri

温馨提示

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

评论

0/150

提交评论