三分钟掌握“迭代器模式”——轻松搞定设计模式

迭代器模式的官方定义:

迭代器模式提供了一种方法,它能够顺序访问一个集合对象中的各个元素,并且又不暴露该对象的内部结构。

不使用迭代器模式实现容器的迭代:

当我们拿到一个含有集合的对象时,如果我们想要遍历对象中的集合,就必须要知道对象的内部结构,然后使用for循环遍历对象中的集合。而且当我们需要换一种遍历方式的时候(如:顺序遍历换成逆序遍历),需要修改客户端的代码,这就违背了“封闭-开放原则”。但如果使用了迭代器模式之后,需要换迭代方式时,只需要增加一个迭代器类,然后稍微修改一下集合对象中的代码,而客户端代码一句也不要动;也就是说,使用了迭代器模式之后,当需要更换迭代方式的时候,我们再增加一个类,而不是修改代码,从而体现了“开放-封闭原则”。

PS:开放-封闭原则:开放扩展,封闭更改。代码一旦写完就不要再去修改,若要增加功能,通过拓展继承体系(也就是增加类)来实现。

迭代器模式类图:

1.首先需要有一个存放许多数据的容器,我们把它称为Collection;其次需要再创建一个类,专门用来遍历容器中的数据,我们把这个类称为Iterator;而且Iterator中包含了遍历容器的一些基本函数。

2.由于容器的内部构造都不尽相同,但他们都需要使用迭代器遍历,因此我们抽象出容器们的公共接口,这个接口中只有一个获取迭代器的函数:iterator();

3.由于每个容器内部构造都不一样,所以迭代这些容器的迭代器的具体实现也不一样,所以我们需要为每一个容易简历一个专门的迭代器类,针对每种容器的内部结构,实现了Iterator接口中的函数。

4.由于具体的迭代器需要知道它所服务的容器的内部结构,所以要在构造迭代器的时候将容器的对象传给迭代器,迭代器拿到具体的容器对象之后,就可以根据这个容器的特性重写next、hasNext、first这些函数了。

5.最后,当迭代器和容器都写好之后,就可以交付给客户使用了。

客户通过容器的iterator函数获得该容器对应的迭代器对象,然后使用该迭代器对象的一些函数就可以遍历容器元素了。

PS:客户通过调用容器对象的iterator函数创建该容器对应的Iterator对象时,该容器的对象将会传递给Iterator对象:

private
Iterator it;

@Override

public
Iterator iterator() {

this.it =
new AIterator(this);

return
this.it;

}

当AIterator对象获取到它所服务的容器对象之后,才能针对该容器的结构重写next、hasNext、first这些函数。

迭代器模式的好处:

1.如果要更换一个具体容器的迭代方式的时候,客户端不需要做任何改动,还是这么写:

Iterator it = collection.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

我们只需要:

a)再创建一个迭代器类,重写里面的next、hasNext、first这些函数;

b)然后让容器类的iterator函数中创建Iterator对象时,将“旧的Iterator”换成“新的Iterator”

public Iterator iterator(){

this.it = new 新的Iterator();

}

因此,一个容器的迭代方式换了之后,不影响客户端的代码,降低了客户端与Iterator类和Collection类的耦合。

2.迭代器模式将集合对象的遍历行为单独封装在一个类中,这样既不暴露集合的内部结构,又可以使外部代码透明地访问集合内部的数据。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 23:31:25

三分钟掌握“迭代器模式”——轻松搞定设计模式的相关文章

三分钟掌握“职责链模式”——轻松搞定设计模式

职责链模式的官方定义: 职责链模式使得多个对象都有机会处理请求,从而降低了请求的发送者和接受者之间的耦合关系.这些对象被连成一条链,并沿着这条链传递发送者的请求,直到有一个对象能处理它为止. 职责链模式的类图: 1.职责链由若干个处理类拼接而成.每个处理类都有两个函数,setNext(Handler)用于设置当前处理类的下一跳地址,handle(request)用于处理请求. 若当前处理类的handle函数无法处理该请求,就将请求传给下一个处理类的handle函数处理. 2.这些处理类写完后交付

怎么把PDF文件转换成Word?三招教你轻松搞定

PDF和Word两个文件之间,相互转换是在我们的工作中经常需要用到的,也曾经是很多职场新人的困扰,很多人都想知道怎么把PDF文件转换成Word?今天呢就来给大家分享三个简单的方法,只需三招就能轻松搞定. 方法1:打开方式为Word 怎么把PDF文件转换成Word?这个方法其实很简单的,只需要点击PDF文档,选择打开方式为Word,利用Word打开即可.步骤:点击PDF文件--右击鼠标--选择[打开方式]--点击Word:方法2:专业转换器 如果在觉得通过Word打开方式不太好用的话,可以使用专业

春节过后就是金三银四求职季,分享几个Java面试妙招,轻松搞定HR!

春节过后就是金三银四,分享几个Java面试妙招,轻松搞定HR!2020年了,先祝大家新年快乐!今年IT职位依然相当热门,特别是Java开发岗位.软件开发人才在今年将有大量的就业机会.春节过后,金三银四求职季到来,下面教你8个"妙招",希望能帮你顺利面试成功.1.知道如何写算法如果你申请的是软件工程师的工作,那么显然你需要知道如何编码.写代码脚本其实与写算法来解决软件问题略有不同.用人单位可能会提出这样的问题,"写一个算法,可以从链表中找到某个元素,并将此元素挪到列表末尾.&q

免费报表工具零代码零基础轻松搞定 web 报表

话说,能制作清单式报表的方式有千千万: 骨灰级的 Excel 控,如果能轻车熟路驾驭 VBA,也能玩出各种花来,再不济借助图表插件外援也能秒杀一众小白选手: 传说中的编程控,只要需求明确没什么做不了的,什么酷炫图形 Echarts 几十行代码,分分钟秀出新花样: 天外飞仙 R 语言控,玩的一手数据挖掘,可视化自不在话下: 爬数据达人 Python 控,手握 matplotlib 包闯天下…… 这么多工具,虽然都能满足我们的需要,但不是每一个报表开发人都能怀揣上述技能的,那么,有没有一款工具可以照

轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)

hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解析),但吃的时候还是一口一口的吃(JS逐行执行)! OK,解决下面五个问题,JS预解析就算过了~~(前提:对JS变量作用域有清晰理解) 一.JS预解析是什么? 其实就是对程序要用到的材料(变量,函数)给一个初始值,并存到一个表中(我自己虚构的),当程序运行到那一行时,就来这个表看有没有初始值,没有就

六步轻松搞定,自建APP不求人

随着互联网浪潮的席卷,越来越多的传统企业开始涉足互联网领域.无论是出于企业转型升级考虑,还是受市场整体环境的驱动,很多企业凭借某一领域的绝对优势,浩浩荡荡进军移动互联网领域,通过自建APP的方式,推出属于自己的移动端应用产品. 不少企业在探寻如何自建APP的过程中,遇到的第一个决策性难题就是:自建APP开发团队还是外包APP建设?其实对于大多数企业而言,由于企业内部组织架构设置问题,尚没有配备完善的自建APP开发团队,同时财政预算有限,难以承担整体自建APP工作.对于这类中小型企业而言,如何能够

Webcast / 技术小视频制作方法——自己动手录制video轻松搞定

Webcast / 技术小视频制作方法——自己动手录制video轻松搞定 http://blog.sina.com.cn/s/blog_67d387490100wdnh.html 最近申请加入MSP的童鞋应该发现了一个新的要求——制作简短的视频!视频的内容要求是与微软技术相关~我们希望通过使用这种方法,简化申请流程,加强对创意.微软相关技术的考察~关于MSP项目以及申请流程的细则近期也会出台,请童鞋们耐心等待~ 首先呢,就跟广大的童鞋们介绍一款简单使用的录屏软件~而通过简单的安装,便可以轻松.便

12步轻松搞定python装饰器

12步轻松搞定python装饰器 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数相关语法的一些特点. 我没法让装饰器变得简单,但是通过一步步的剖析,我也许能够让你在理解装饰器的时候更自信一点.因为装饰器很复杂,这篇文章将会很长(自己都说很长,还敢这么多废话blablabla...前戏就不继续翻译直接省略了) 1. 函数 在python中,函数通

深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去.但是OO的Decorator简直就是一场恶梦,不信你就去看看wikipedia上的词条