资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
课程名称: 软件体系结构与设计迭代器(Iterator )模式实验一、实验目的1. 掌握迭代器模式的概念;2. 掌握迭代器模式的功能;3. 加深对迭代器模式的了解;4. 提高对迭代器模式的运用;5. 将该模式运用但实际的生活中。二、实验容1. 阅读和查看资料了解迭代器模式的概念和功能;2. 将有关代理模式的迭代器模式理解透彻并运行;3. 举例说明生活中的一个可以使用迭代器模式的例子;4. 熟悉迭代器模式的扩展,迭代器模式是比较有用途的一种模 式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构。三、实验环境Windows7 、Java 虚拟机 、MyEclipse 环境下运行代码。四、实验设计原理迭代器(Iterator)模式,又叫做游标(Cursor)模式。它提供一种方 法顺序访问一个聚合对象(或容器对象:container)中各个元素,而 又不需暴露该对象的部。聚合:表示一组对象的组合结构,比如JAVA中的数组,集合等从定 义可见,迭代器模式是为容器而生。很明显,对容器对象的访问必然涉与到遍历算法。你可以一股脑的将遍历方法塞到容器对象中去;或 者根本不去提供什么遍历算法,让使用容器的人自己去实现去吧。这 两种情况好像都能够解决问题。然而在前一种情况,容器承受了过多的功能,它不仅要负责自己 “容器”的元素维护(添加、删除等等),而且还要提供遍历自身的 接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进 行多个遍历。第二种方式倒是省事,却又将容器的部细节暴露无遗。而迭代器模式的出现,很好的解决了上面两种情况的弊端。迭代器模式的类图如下图所示:KI迭代抽象类用于定熨猖到开始对象、得到下一于对象7廩集抽象类j判断是否到结尾,当前对壕抽象方法,统1接口IteratorAggregate-+Createltertor(): IteratorClient4+First()+LJext() +IsDone() +Currentltem()ConcreteiteratorConcreteAggregate+Createlterator(): Iterator具祥聚集裘,继承旳grepte具傑迭代器类继literati实现开嫦片 一下一于、是否结尾,当前对象方法类图解读:从结构上可以看出,迭代器模式在客户与容器之间加入了迭代器 角色。迭代器角色的加入,就可以很好的避免容器部细节的暴露,而 且也使得设计符号“单一职责原则”。注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在 一起的一一遍历算法是与容器的部细节紧密相关的。为了使客户程序 从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的 更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使 得客户程序更具一般性和重用性。这被称为多态迭代。迭代器模式所涉与的角色有:参与者:迭代器角色(Iterator):定义访问和遍历元素的接口。具体迭代器角色(Concrete Iterator):关联到被迭代的具体聚集对象角色,继承迭代器角色实现具体的 迭代,并负责管理记录遍历中的当前位置。聚集对象抽象角色(Aggregate): 负责提供创建具体迭代器角色的接口。具体聚集对象角色(Concrete Aggreate):持有一个对象的集合,实现创建具体迭代器角色的接口,返回集 合遍历所依赖的一个迭代器。 一个迭代器模式例子: 20世纪80年代的黑白电视机,没有遥控器,每次开关机或者换 台都需要通过电视机上面的那些按钮来完成,如果你想换台的话, 需要亲自用手去旋转换台的按钮,每转一下就“啪”的响一声, 如果没有收到任何电视频道就会出现一片让人眼花的雪花点。还要移动电视机上面那两根可以前后左右移动变长变短的天线。随 着科技的飞速发展,越来越高级的电视机相继出现,那种古老的 电视机几乎看不到了。与那时的电视机相比,现今的电视机给我 们带来的最大便利之一就是增加了电视机遥控器,我们在进行开 机、关机、换台、改变音量等操作时都无须直接操作电视机,可 以通过遥控器来间接实现。我们可以将电视机看成一个存储电视 频道的集合对象,通过遥控器可以对电视机中的电视频道集合进 行操作,如返回上一个频道、跳转到下一个频道或者跳转至指定 的频道。遥控器为我们操作电视频道带来很大的方便,用户并不 需要知道这些频道到底如何存储在电视机中。电视机遥控器和电 视机示意图如图1所示:电视机遥控器电视机电视频道的集合)在软件开发中,也存在大量类似电视机一样的类,它们可以存储多 个成员对象(元素),这些类通常称为聚合类(Aggregate Classes), 对应的对象称为聚合对象。为了更加方便地操作这些聚合对象,同 时可以很灵活地为聚合对象增加不同的遍历方法,我们也需要类似 电视机遥控器一样的角色,可以访问一个聚合对象中的元素但又不 需要暴露它的部结构。本章我们将要学习的迭代器模式将为聚合对 象提供一个遥控器,通过引入迭代器,客户端无须了解聚合对象的 部结构即可实现对聚合对象中成员的遍历,还可以根据需要很方便 地增加新的遍历方式。迭代器模式的作用:迭代器模式能够遍历一组聚合对象,不需要了解其部结构还能提 供不同的遍历方法。就是分离了集合对象的遍历行为,将遍历算法交给这个迭代器角 色来完成,可以很好的避免容器部细节的暴露,而且也使得设计 符合“单一职责原则”另外迭代器模式抽象了具体迭代器角色, 可以通过对一个抽象迭代器多个集成可来完成同一聚集对象的多 种遍历。五、迭代器模式示例性代码首先有一个抽象的聚集,所谓的聚集就是就是数据的集合,可以循环去访问它。它只有一个方法Getlterator ()让子类去实现,用来获得一个迭代器对象。I / vsummary 2 3 / 抽象聚集4 5 / v/summary6 7 public in terface IList8 9 10 IIterator Getlterator();II 抽象的迭代器,它是用来访问聚集的类,封装了一些方法,用来把聚集中的数据按顺序读取 出来。通常会有MoveNext()、Currentltem()、Fisrt()、Next()等几个方法让子类去实现。1 / vsummary 2 3 / 抽象迭代器4 5 / 6 7 public in terface Ilterator8 9 bool MoveNext();10 11Object Curre ntltem();12 13void First();14 15void Next();16 具体的聚集,它实现了抽象聚集中的唯一的方法,同时在里面保存了一组数据,这里我们加 上Length属性和GetElement()方法是为了便于访问聚集中的数据。1 / vsummary 2 3 / 具体聚集4 5 / v/summary6 7 public class ConcreteList : IList8 9 in t list;10 11public Con creteList()12 1314 list = new int 1,2,3,4,5;15 16 17public Ilterator GetIterator()18 1920 return new Concretelterator(this);21 22 23public int Length24 2526 get return list.Length;27 28 29public int GetElement(int index)30 3132 return listi ndex;468101113151718202123252628323335373839414344454749505233 34 具体迭代器,实现了抽象迭代器中的四个方法,在它的构造函数中需要接受一个具体聚集类 型的参数,在这里面我们可以根据实际的情况去编写不同的迭代方式。1 /*/ vsummary 2 3 / 具体迭代器5 / v/summary7 public class Concretelterator :【Iterator9 private Con creteList list;12 private int index;14 public Con creteIterator(C on creteList list)16 this.list = list;19in dex = 0;22 public bool MoveNext()24if (in dex v list.Le ngth)27return true;29 else30 31return false;34 public Object Curre ntItem()36return list.GetEleme nt(i ndex);40 public void First()42in dex = 0;46 public void Next()48if (in dex v list.Le ngth)51in dex+;5354 55 简单的客户端程序调用:1 /*/ vsummary 2 3 / 客户端程序4 5 / v/summary6 7 class Program8 9 10 static void Main(string args)11 1213IIterator iterator;14 15IList list = new ConcreteList();16 17iterator = list.GetIterator();18 19while (iterator.MoveNext()20 2122int i = (int)iterator.Currentltem();23Con sole.WriteL in e(i.ToStri ng();24 25iterator.Next();2627 28Con sole.Read();29 3031 32 Iterator实现要点:1迭代抽象:访问一个聚合对象的容而无需暴露它的部表示。2迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。3迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。题目:假设某软件公司Z为某超市开发了一套销售管理系统,在对该 系统进行分析和设计时,Z公司开发人员发现经常需要对系统中的商 品数据、客户数据等进行遍历,为了复用这些遍历代码,z公司开发人员设计了一个抽象的数据聚合类Abs trac tObjec tLis t,而将存储 商品和客户登记的类作为其子类。AbstractObjectList类结构如下 图所示。AbstractObjec
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号