软件设计与体系结构课件8迭代器模式

上传人:E**** 文档编号:91205591 上传时间:2019-06-26 格式:PPT 页数:57 大小:425KB
返回 下载 相关 举报
软件设计与体系结构课件8迭代器模式_第1页
第1页 / 共57页
软件设计与体系结构课件8迭代器模式_第2页
第2页 / 共57页
软件设计与体系结构课件8迭代器模式_第3页
第3页 / 共57页
软件设计与体系结构课件8迭代器模式_第4页
第4页 / 共57页
软件设计与体系结构课件8迭代器模式_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《软件设计与体系结构课件8迭代器模式》由会员分享,可在线阅读,更多相关《软件设计与体系结构课件8迭代器模式(57页珍藏版)》请在金锄头文库上搜索。

1、软件设计与体系结构 迭代器模式 主讲:李健利,迭代器模式,意图 =提供一种在无需暴露聚合对象内部表示的情况下顺序访问该对象中各个元素的方法 =聚合对象是为将其他对象聚集为一个单元而包含其他对象的一个对象。也称作容器或集合。链表和散列表均是其实例 别名 =光标 动机 =聚合对象,如列表,应该允许人们遍历其元素,而无需暴露其内部结构。 =它应该允许不同的遍历方式 =它应该允许多个遍历同时进行 =但确实不想把这些方法都添加到聚合对象的接口中,迭代器例1,具有迭代器的列表聚合类:,迭代器例1 (续),典型的客户代码: . List list = new List(); . ListIterator i

2、terator = new ListIterator(list); iterator.First(); while (!iterator.IsDone() Object item = iterator.CurrentItem(); / Code here to process item. iterator.Next(); .,迭代器例2,多态迭代器,迭代器例2 (续),典型的客户代码: List list = new List(); SkipList skipList = new SkipList(); Iterator listIterator = list.CreateIterator()

3、; Iterator skipListIterator = skipList.CreateIterator(); handleList(listIterator); handleList(skipListIterator); . public void handleList(Iterator iterator) iterator.First(); while (!iterator.IsDone() Object item = iterator.CurrentItem(); / Code here to process item. iterator.Next(); ,迭代器模式,适用性 迭代器模

4、式可用来: =支持无需暴露聚合对象内部表示的聚合对象遍历 =支持聚合对象的多个遍历同时进行 =为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代),迭代器模式,结构,迭代器模式,迭代器模式,参与者 =Iterator(迭代器) 定义访问和遍历元素的接口 =ConcreteIterator(具体迭代器) 实现迭代器接口 遍历时记录当前位置 =Aggregate(聚合) 定义创建迭代器对象的接口(工厂方法!) =ConcreteAggregate 实现迭代器创建接口以返回适当具体迭代器的实例,迭代器模式,效果 =收益 简化聚合的接口,使其不被遍历方法污染 支持多个遍历同时进行 支持不同的遍

5、历技术 =缺陷 无 实现问题 =谁控制迭代? 客户= 更灵活;称作外部迭代器。 迭代器自身=称作内部迭代器 使用外部迭代器的客户必须主动推进遍历的步伐,显式地向迭代器请求下一个元素。相反地, 若使用内部迭代器,客户只需向其提交一个待执行的操作,而迭代器将对聚合中的每一个元素实施该操作。,迭代器模式,实现问题 =谁定义遍历算法? 迭代器 = 更普遍; 更容易使用不同的遍历算法 遍历算法可能需要访问聚合的私有变量。如果这样,将遍历算法放入迭代器中会破坏聚合的封装性。 聚合 = 迭代器只保存迭代状态 聚合本身也可以定义遍历算法,并在遍历过程中用迭代器来存储当前迭代的状态。我们称这种迭代器为一个光标,

6、因为它仅用来指示当前位置。客户会以这个游标为一个参数调用该聚合的Next操作,而Next 操作将改变这个指示器的状态。 =遍历聚合的同时能更改聚合吗?允许插入和删除操作而不影响遍历也无需复制聚合的迭代器称作健壮的迭代器 =应该用附加操作,诸如previous(),来增强迭代器接口吗?,迭代器模式,已知应用 =ObjectSpace的Java Generic Library 容器 =Rogue Wave的Tools.h+ 集合 =java.util.Enumeration接口 =Java 2 集合框架迭代器接口 相关模式 =工厂方法 多态迭代器使用工厂方法来实例化适当的迭代器子类。 =组合模式

7、迭代器经常用于递归遍历复合结构。,迭代器的Java 实现,与观察者模式一样,Java提供对迭代器模式的内置支持 java.util.Enumeration接口起到迭代器接口的作用 想要支持迭代的聚合类提供返回Enumeration对象引用的方法 该Enumeration对象实现Enumeration 接口和允许客户遍历聚合对象 Java JDK 1.1具有数量有限的聚合类:Vector和 Hashtable Java JDK 1.2引入具有更多聚合类的新集合程序包,包括sets, lists, maps和Iterator接口。,Enumeration接口,public abstract boo

8、lean hasMoreElements() =如果enumeration包含更多元素,则返回true;否则返回false public abstract Object nextElement() =返回enumeration的下一个元素 =如果没有更多元素存在则抛出NoSuchElementException 对应关系: =hasMoreElements() = IsDone() =nextElement() = Next() 后跟随CurrentItem() =注意没有First(). 创建Enumeration时,自动完成First()的工作,Enumeration实例,测试程序: im

9、port java.util.*; public class TestEnumeration public static void main(String args) / Create a Vector and add some items to it. Vector v = new Vector(); v.addElement(new Integer(5); v.addElement(new Integer(9); v.addElement(new String(“Hi, There!“); / Traverse the vector using an Enumeration. Enumer

10、ation ev = v.elements(); System.out.println(”nVector values are:“); traverse(ev);,Enumeration实例 (续),/ Now create a hash table and add some items to it. Hashtable h = new Hashtable(); h.put(“Bob“, new Double(6.0); h.put(“Joe“, new Double(18.5); h.put(“Fred“, new Double(32.0); / Traverse the hash tabl

11、e keys using an Enumeration. Enumeration ekeys = h.keys(); System.out.println(“nHash keys are:“); traverse(ekeys); / Traverse the hash table values using an Enumeration. Enumeration evalues = h.elements(); System.out.println(“nHash values are:“); traverse(evalues); ,Enumeration实例 (续),private static

12、void traverse(Enumeration e) while (e.hasMoreElements() System.out.println(e.nextElement(); ,Enumeration实例 (续),测试程序输出: Vector values are: 5 9 Hi, There! Hash keys are: Joe Fred Bob Hash values are: 18.5 32.0 6.0,Vector Enumeration,现在看看Vector.java: public class Vector implements Cloneable, java.io.Se

13、rializable . protected Object elementData; protected int elementCount; protected int capacityIncrement; public Vector(int initialCapacity, int capacityIncrement) super(); this.elementData = new ObjectinitialCapacity; this.capacityIncrement = capacityIncrement; public Vector(int initialCapacity) this

14、(initialCapacity, 0); public Vector() this(10); 该类实现了 Cloneable 接口和Serializable接口,Cloneable 接口,指示 Object.clone() 方法可以合法地对该类实例进行按字段复制,Serializable接口,支持串行化(序列化) 只有一个实现它的对象可以被串行化工具存储和恢复 没有定义任何成员,只用来表示一个类可以被串行化 若该类可以串行化,那么它的所有子类都可以,串行化(Serialization),对象的持续性(persistence)。 对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要

15、将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力。叫作对象的持续性(persistence) 对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化,串行化(Serialization),串行化的主要任务是写出对象实例变量的数值。 如果变量是另一对象的引用,则引用的对象也要串行化。 这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括原有对象、对象的对象、对象的对象的对象等等。 对象所有权的层次结构称为图表(graph)。,对象串行化的定义,允许将实现了Serializable接口的对象转换为字节序列 这些字节序列可以被完全存

16、储以备以后重新生成原来的对象 串行化不但可以在本机做,而且可以经由网络操作(RMI) 自动屏蔽了操作系统的差异、字节顺序 比如,在Window平台生成一个对象并序列化之,然后通过网络传到一台Unix机器上,然后可以在这台Unix机器上正确地重构这个对象。,对象串行化主要支持的2种特性,Java的RMI(remote method invocation). RMI允许象在本机上一样操作远程机器上的对象。当发送消息给远程对象时,就需要用到串行化机制来发送参数和接收返回值。 Java的JavaBeans. Bean的状态信息通常是在设计时配置的。Bean的状态信息必须被存起来,以便当程序运行时能恢复这些状态信息。这也需要串行化机制。,Vector定义中的参数,initialCapacity Vector 运行时创建的一个初始的存储容量,。 capacityIncrement 其存储容量以capacityIncrement 变量定义的增量增

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号