ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:295.48KB ,
资源ID:8382503      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8382503.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(迭代器模式实验含答案.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

迭代器模式实验含答案.docx

1、迭代器模式实验含答案课程名称: 软件体系结构与设计 迭代器(Iterator)模式实验一、实验目的1. 掌握迭代器模式的概念;2. 掌握迭代器模式的功能;3. 加深对迭代器模式的了解;4. 提高对迭代器模式的运用;5. 将该模式运用但实际的生活中。二、实验内容1. 阅读和查看资料了解迭代器模式的概念和功能;2. 将有关代理模式的迭代器模式理解透彻并运行;3. 举例说明生活中的一个可以使用迭代器模式的例子;4. 熟悉迭代器模式的扩展,迭代器模式是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构。三、实验环境Windows7 、Java虚拟机 、MyEclipse 环境下

2、运行代码。4、实验设计原理 迭代器(Iterator)模式,又叫做游标(Cursor)模式。它提供一种方法顺序访问一个聚合对象(或容器对象:container)中各个元素, 而又不需暴露该对象的内部。聚合:表示一组对象的组合结构,比如JAVA中的数组,集合等从定义可见,迭代器模式是为容器而生。很明显,对容器对象的访问必然涉及到遍历算法。你可以一股脑的将遍历方法塞到容器对象中去;或者根本不去提供什么遍历算法,让使用容器的人自己去实现去吧。这两种情况好像都能够解决问题。然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由

3、于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。第二种方式倒是省事,却又将容器的内部细节暴露无遗。而迭代器模式的出现,很好的解决了上面两种情况的弊端。迭代器模式的类图如下图所示: 类图解读:从结构上可以看出,迭代器模式在客户与容器之间加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器内部细节的暴露,而且也使得设计符号“单一职责原则”。注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的遍历算法是与容器的内部细节紧密相关的。为了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序

4、更具一般性和重用性。这被称为多态迭代。迭代器模式所涉及的角色有:参与者:迭代器角色(Iterator):定义访问和遍历元素的接口。具体迭代器角色(Concrete Iterator):关联到被迭代的具体聚集对象角色,继承迭代器角色实现具体的迭代,并负责管理记录遍历中的当前位置。聚集对象抽象角色(Aggregate):负责提供创建具体迭代器角色的接口。具体聚集对象角色(Concrete Aggreate):持有一个对象的集合,实现创建具体迭代器角色的接口,返回集合遍历所依赖的一个迭代器。 一个迭代器模式例子: 20世纪80年代的黑白电视机,没有遥控器,每次开关机或者换台都需要通过电视机上面的那些

5、按钮来完成,如果你想换台的话,需要亲自用手去旋转换台的按钮,每转一下就“啪”的响一声,如果没有收到任何电视频道就会出现一片让人眼花的雪花点。还要移动电视机上面那两根可以前后左右移动变长变短的天线。随着科技的飞速发展,越来越高级的电视机相继出现,那种古老的电视机几乎看不到了。与那时的电视机相比,现今的电视机给我们带来的最大便利之一就是增加了电视机遥控器,我们在进行开机、关机、换台、改变音量等操作时都无须直接操作电视机,可以通过遥控器来间接实现。我们可以将电视机看成一个存储电视频道的集合对象,通过遥控器可以对电视机中的电视频道集合进行操作,如返回上一个频道、跳转到下一个频道或者跳转至指定的频道。遥

6、控器为我们操作电视频道带来很大的方便,用户并不需要知道这些频道到底如何存储在电视机中。电视机遥控器和电视机示意图如图1所示: 在软件开发中,也存在大量类似电视机一样的类,它们可以存储多个成员对象(元素),这些类通常称为聚合类(Aggregate Classes),对应的对象称为聚合对象。为了更加方便地操作这些聚合对象,同时可以很灵活地为聚合对象增加不同的遍历方法,我们也需要类似电视机遥控器一样的角色,可以访问一个聚合对象中的元素但又不需要暴露它的内部结构。本章我们将要学习的迭代器模式将为聚合对象提供一个遥控器,通过引入迭代器,客户端无须了解聚合对象的内部结构即可实现对聚合对象中成员的遍历,还可

7、以根据需要很方便地增加新的遍历方式。 迭代器模式的作用: 迭代器模式能够遍历一组聚合对象,不需要了解其内部结构还能提供不同的遍历方法。 就是分离了集合对象的遍历行为,将遍历算法交给这个迭代器角色来完成,可以很好的避免容器内部细节的暴露,而且也使得设计符合“单一职责原则”,另外迭代器模式抽象了具体迭代器角色,可以通过对一个抽象迭代器多个集成可来完成同一聚集对象的多种遍历。五、迭代器模式示例性代码首先有一个抽象的聚集,所谓的聚集就是就是数据的集合,可以循环去访问它。它只有一个方法GetIterator()让子类去实现,用来获得一个迭代器对象。1/23/抽象聚集45/67publicinterfac

8、eIList8910IIteratorGetIterator();11 抽象的迭代器,它是用来访问聚集的类,封装了一些方法,用来把聚集中的数据按顺序读取出来。通常会有MoveNext()、CurrentItem()、Fisrt()、Next()等几个方法让子类去实现。1/23/抽象迭代器45/67publicinterfaceIIterator89boolMoveNext();1011ObjectCurrentItem();1213voidFirst();1415voidNext();16 具体的聚集,它实现了抽象聚集中的唯一的方法,同时在里面保存了一组数据,这里我们加上Length属性和Ge

9、tElement()方法是为了便于访问聚集中的数据。1/23/具体聚集45/67publicclassConcreteList:IList89intlist;1011publicConcreteList()121314list=newint1,2,3,4,5;151617publicIIteratorGetIterator()181920returnnewConcreteIterator(this);212223publicintLength242526getreturnlist.Length;272829publicintGetElement(intindex)303132returnlis

10、tindex;3334 具体迭代器,实现了抽象迭代器中的四个方法,在它的构造函数中需要接受一个具体聚集类型的参数,在这里面我们可以根据实际的情况去编写不同的迭代方式。1/*/23/具体迭代器45/67publicclassConcreteIterator:IIterator8910privateConcreteListlist;1112privateintindex;1314publicConcreteIterator(ConcreteListlist)151617this.list=list;1819index=0;202122publicboolMoveNext()232425if(ind

11、exlist.Length)2627returntrue;2829else3031returnfalse;323334publicObjectCurrentItem()353637returnlist.GetElement(index);383940publicvoidFirst()414243index=0;444546publicvoidNext()474849if(indexlist.Length)505152index+;535455简单的客户端程序调用:1/*/23/客户端程序45/67classProgram8910staticvoidMain(stringargs)111213I

12、Iteratoriterator;1415IListlist=newConcreteList();1617iterator=list.GetIterator();1819while(iterator.MoveNext()202122inti=(int)iterator.CurrentItem();23Console.WriteLine(i.ToString();2425iterator.Next();262728Console.Read();29303132Iterator实现要点:1迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。2迭代多态:为遍历不同的集合结构提供一个统一的接口,从

13、而支持同样的算法在不同的集合结构上进行操作。3迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。题目:假设某软件公司Z为某超市开发了一套销售管理系统,在对该系统进行分析和设计时,Z公司开发人员发现经常需要对系统中的商品数据、客户数据等进行遍历,为了复用这些遍历代码,Z公司开发人员设计了一个抽象的数据聚合类AbstractObjectList,而将存储商品和客户登记的类作为其子类。AbstractObjectList类结构如下图所示。在上图中,IList类型的对象objects用于存储数据,AbstractObjectList类的方法说明如下表所示:AbstractObject

14、List类的子类ProductList和CustomerList分别用于存储商品数据和客户数据。请用迭代器模式编程实现。代码:import java.util.*; /抽象聚合类 abstract class AbstractObjectList protected List objects = new ArrayList(); public AbstractObjectList(List objects) this.objects = objects; public void addObject(Object obj) this.objects.add(obj); public void r

15、emoveObject(Object obj) this.objects.remove(obj); public List getObjects() return this.objects; /声明创建迭代器对象的抽象工厂方法 public abstract AbstractIterator createIterator(); /商品数据类:具体聚合类 class ProductList extends AbstractObjectList public ProductList(List products) super(products); /实现创建迭代器对象的具体工厂方法 public A

16、bstractIterator createIterator() return new ProductIterator(this); /客户数据类:具体聚合类 class CustomerList extends AbstractObjectList public CustomerList(List customers) super(customers); /实现创建迭代器对象的具体工厂方法 public AbstractIterator createIterator() return new CustomerIterator(this); /抽象迭代器 interface AbstractI

17、terator public void next(); /移至下一个元素 public boolean isLast(); /判断是否为最后一个元素 public void previous(); /移至上一个元素 public boolean isFirst(); /判断是否为第一个元素 public Object getNextItem(); /获取下一个元素 public Object getPreviousItem(); /获取上一个元素 /商品迭代器:具体迭代器 class ProductIterator implements AbstractIterator private Pro

18、ductList productList; private List products; private int cursor1; /定义一个游标,用于记录正向遍历的位置 private int cursor2; /定义一个游标,用于记录逆向遍历的位置 public ProductIterator(ProductList list) this.productList = list; this.products = list.getObjects(); /获取集合对象 cursor1 = 0; /设置正向遍历游标的初始值 cursor2 = products.size() -1; /设置逆向遍历

19、游标的初始值 public void next() if(cursor1 -1) cursor2-; public boolean isFirst() return (cursor2 = -1); public Object getNextItem() return products.get(cursor1); public Object getPreviousItem() return products.get(cursor2); /客户迭代器:具体迭代器 class CustomerIterator implements AbstractIterator private CustomerL

20、ist customerList; private List customers; private int cursor1; /定义一个游标,用于记录正向遍历的位置 private int cursor2; /定义一个游标,用于记录逆向遍历的位置 public CustomerIterator(CustomerList list) this.customerList = list; this.customers = list.getObjects(); /获取集合对象 cursor1 = 0; /设置正向遍历游标的初始值 cursor2 = customers.size() -1; /设置逆向

21、遍历游标的初始值 public void next() if(cursor1 -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 products = ne

22、w ArrayList(); products.add(农夫山泉); products.add(百岁山); products.add(康师傅); products.add(旺仔); products.add(统一); AbstractObjectList list; AbstractIterator iterator; list = new ProductList(products); /创建聚合对象 iterator = list.createIterator(); /创建迭代器对象 System.out.println(*商品数据*); System.out.println(正向遍历:);

23、 while(!iterator.isLast() System.out.print(iterator.getNextItem() + ,); iterator.next(); System.out.println(); System.out.println(逆向遍历:); while(!iterator.isFirst() System.out.print(iterator.getPreviousItem() + ,); iterator.previous(); List customers = new ArrayList(); customers.add(张三); customers.ad

24、d(李四); customers.add(王五); customers.add(赵六); AbstractObjectList list1; AbstractIterator iterator1; list1 = new ProductList(customers); /创建聚合对象 iterator1 = list1.createIterator(); /创建迭代器对象 System.out.println(); System.out.println(*客户数据*); System.out.println(正向遍历:); while(!iterator1.isLast() System.out.print(iterator1.getNextItem() + ,); iterator1.next(); System.out.println(); System.out.println(逆向遍历:); while(!iterator1.isFirst() System.out.print(iterator1.getPreviousItem() + ,); iterator1.previous();

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1