迭代器模式和Java

大家好,在本文中,我们将检查Iterator Pattern 。 我知道你们中许多人已经使用过一种设计模式,但是也许您没有意识到它是模式,或者不知道它的巨大价值。 根据《 Head First Design 》一书:

迭代器模式提供了一种在不暴露其底层表示的情况下顺序访问聚合对象的元素的方法。
哇啊? 好吧,它表示无论您使用什么数据结构(数组,列表,哈希表等),如果实现此模式,都可以以相同的方式遍历它。 它为您提供了一种访问数据结构(聚合)元素的统一方法,但您不必知道哪种数据结构 您正在遍历...很好! 同样,它在Iterator对象上而不是在数据结构上设置迭代的责任,从而简化了数据结构中的编码。 让我们检查一下Iterator模式的经典类图:

Iterator Pattern的实际类图进行了一些更改,特别是在Iterator类(接口)中,现在我们将在稍后看到不同的方法,但是首先让我们回顾一下以前的每个类(或接口) ):

  • Aggregate :这是我们数据结构的基类(或接口),您可以将其视为java.util.Collection接口,它为集合类定义了许多方法。
  • ConcreteAggregate :这是我们将要迭代的具体数据结构,例如java.util.ArrayList , java.util.Vector等。
  • 迭代器迭代器的基类(或接口)。 您可以通过java.util.Iterator在Java 中找到一个。 您会注意到Java版本有不同的方法,我们将在本文后面讨论。 在这里,您定义了遍历数据结构所需的de方法。
  • ConcreteIterator :当您要遍历不同的数据结构时,需要不同的迭代器。 因此,concreteIterator是要遍历的数据结构的Iterator。

现在,让我们看一下Iterator Pattern的Java实现。 下图是使用Architexa的免费代码理解工具生成的 ,它显示了Java Collections Framework的某些类之间的关系,在这里我们可以看到类似于经典类图的结构:

上图仅显示了Java模式的一种实现,还有很多,但它们始终使用java.util.Iterator接口; 这是在用Java进行编码时应在Iterator Pattern的实现中使用的接口。 让我们比较两个图:

经典图
骨料
混凝土骨料
迭代器
ConcreteIterator

请注意,Java示例中Iterator对象的方法与经典类图中的方法不同:

  • 没有+ First()方法。 如果需要转到第一个元素,则必须实例化一个新的迭代器。
  • + IsDone()方法已重命名为+ hasNext()。
  • + Next()和+ CurrentItem()已合并到+ next()中。
  • + remove()方法已添加。

因此,如果您不得不使用不同的数据结构,并且需要一种统一的方式遍历它们和/或访问它们的项,请考虑一下迭代器模式:

//... in a class/*** Traverse a list, hashtable, vector, etc. what ever that implements* the Iterator Pattern*/public void traverse(Iterator iter){while(iter.hasNext()){System.out.println(iter.next());}}

当然,您始终必须为数据结构创建ConcreteIterator类,但是如果您使用的是
Java Collections Framework ,它已经完成。

最后一件事,请记住最重要的OO原则: 始终使用满足您需求的最简单解决方案,即使它不包含pattern

资源:

Freeman Eric和Freeman Elisabeth以及Sierra Kathy和Bates Bert(2004)。 头先设计模式 。 美利坚合众国:O'Reilly Media,Inc.

参考:来自Java和ME博客的JCG合作伙伴 Alexis Lopez的Iterator Pattern和Java 。

翻译自: https://www.javacodegeeks.com/2013/01/iterator-pattern-and-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不使用JavaScript实现菜单的打开和关闭

我在写有菜单栏的网页时,基本都会用响应式设计来适配移动端,例如把不重要的菜单选项隐藏,或者创建一个菜单按钮来控制的菜单的打开和关闭之类的。而我之前一直是使用JavaScript来实现菜单的打开和关闭的,但最近在网上看到有人使用…

负载均衡的几种方式

(1)HTTP重定向负载均衡。 这种负载均衡方案的优点是比较简单,缺点是浏览器需要每次请求两次服务器才能拿完成一次访问,性能较差。(2)DNS域名解析负载均衡。 DNS域名解析负载均衡的优点是将负载均衡工作交给…

芝枝.计算机与人文科学,计算机与人文科学

计算机与人文科学(2013-03-13 13:24:17)标签:文化战争名著《静静的顿河》可以说从它诞生起便没有平静过,围绕它的作者所引起的争议,就像它获得诺贝尔文学奖一样,撼动文坛,有人指控肖洛霍夫是个骗子,《静静的…

rto初始化和计算_TCP系列13—重传—3、协议中RTO计算和RTO定时器维护

从上一篇示例中我们可以看到在TCP中有一个重要的过程就是决定何时进行超时重传,也就是RTO的计算更新。由于网络状况可能会受到路由变化、网络负载等因素的影响,因此RTO也必须跟随网络状况动态更新。如果TCP过早重传,则可能会向网络中注入很多…

在Java 8 Lambda上使用Apache Commons Functor功能接口

Apache Commons Functor (以下称为[functor])是一个Apache Commons组件,它提供功能性的编程API和已实现的几种模式(访问者,生成器,聚合器等)。 Java 8具有几个不错的新功能,包括lamb…

HTML5 Canvas游戏开发实战 PDF扫描版

HTML5 Canvas游戏开发实战主要讲解使用HTML5 Canvas来开发和设计各类常见游戏的思路和技巧,在介绍HTML5 Canvas相关特性的同时,还通过游戏开发实例深入剖析了其内在原理,让读者不仅知其然,而且知其所以然。在本书中,除…

多线程之创建线程

在Java中,线程能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后…

阿 Q 的停车场

问题描述 刚拿到驾照的 KJ 总喜欢开着车到处兜风,玩完了再把车停到阿 Q 的停车场里,虽然 她对自己停车的水平很有信心,但她还是不放心其他人的停车水平,尤其是 Kelukin。于是, 她每次都把自己的爱车停在距离其它车最远…

css3图片垂直居中

图片相对父元素垂直居中, css3属性给父级元素设置 display: -webkit-box; -moz-box-align: center; -webkit-box-align: center; -moz-box-pack: center; -webkit-box-pack: center; 需要注意的是: 父级元素要有确定的高度!

声明式的理解【gpt】

一 MyBatis采用了声明式语法来进行SQL映射配置【mybatis声明式】 MyBatis是一款优秀的持久层框架,支持自定义SQL、存储过程以及高级映射,使得开发人员能够专注于SQL本身而不是数据库访问。MyBatis提供了两种配置方式:XML配置和注解配置&…

网络局域网看不到其它计算机,局域网中看不到其它计算机怎么办

通过网上邻居或查看网络计算机时,看不到局域网中其它计算机,这是怎么回事呢?下面是学习啦小编给大家整理的一些有关看不到局域网中其它计算机的解决方法,希望对大家有帮助!局域网中看不到其它计算机的解决方法打开“控制面板”-“网络和Inte…

iconfont 图标转为字体_iconfont字体图标的使用方法--超简单!

我之前因为项目用bootstrap比较多,所以使用font awesome字体图标比较多,后来接触到了iconfont,发现想要的什么图标都有,还可以自定义图标,非常强大!之前看了一波教程,觉得繁琐,自己弄明白后感觉如此简单,做了这么个简单教程,直接上图,简单粗暴,避免新手走弯路,这里讲解的默认是…

一罐来统治所有人

跳下内存通道 早在1998年,当我是一名C / C 开发人员时,尝试使用Java时,有关该语言的一些内容对我来说就显得有些恼火了。 我记得很担心这些 为什么没有合适的编辑器呢? C / C 有很多。 我为Java拥有的只是旧的记事本。 当我想要…

Django集合Ueditor

语言版本环境:python3.6 1、win安装步骤: 1 git下载源码https://github.com/zhangfisher/DjangoUeditor 2 解压DjangoUeditor3-master.tar 3 cd C:\Users\fj\Desktop\DjangoUeditor3-master 4 python setup.py install 官方建议使用pip install Djang…

计算机二级高级应用考题,2016计算机二级MSOFFICE高级应用考试真题

2016计算机二级MSOFFICE高级应用考试真题离2016上半年的计算机等级考试只有一个多月了,为了帮助大家尽快考试过关,小编整理了计算机二级office考试题,希望能帮助到大家!(1)下列叙述中正确的是A)一个算法的空间复杂度大,则其时间复…

ANTLR –语义谓词

用antlr解析简单的语法很简单 。 您要做的就是使用正则表达式描述您的语言,并让antlr生成词法分析器和解析器。 解析大型或复杂的语言有时会需要更多,因为仅使用正则表达式描述它们是困难的,甚至是不可能的。 语义谓词是在语法内部编写的Jav…

python输入一个数组输出24进制式的时间_4.4 用于数组的文件输入输出 线性代数...

Numpy能够读写磁盘上的文本数据或二进制数据。这一小节只讨论Numpy的内置二进制格式,因为更多的用户会使用pandas或其它工具加载文本或表格数据(见第6章)。np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数组是以未压缩的原始二进制格式…

DBMS-数据库设计与E-R模型:E-R模型、约束、E-R图、E-R扩展特性、E-R图转换为关系模式、UML建模...

设计过程概览 1. 设计阶段 最初阶段:刻画未来数据库用户的数据需求,产品为用户需求规格说明; 概念设计阶段(conceptual-design phase):(关注描述抽象数据及其联系,通常使用实体-联系…

tooltip.css-2.0文档

tooltip.css 纯CSS鼠标提示工具。 v. 2.0.0 更新日期&#xff1a;2018.4.12 预览DEMO。 安装&#xff1a; 只需在页面中引入"tooltip.css"或“tooltip.min.css”文件即可。 如&#xff1a; <link rel"stylesheet" href"css/tooltip.css"…

Java虚拟机:如何判定哪些对象可回收?

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明出处&#xff0c;欢迎交流学习&#xff01; 在堆内存中存放着Java程序中几乎所有的对象实例&#xff0c;堆内存的容量是有限的&#xff0c;Java虚拟机会对堆内存进行管理&#xff0c;回收已经“死去”的对象&…