前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >漫谈模式之迭代器模式

漫谈模式之迭代器模式

作者头像
孟君
发布2023-03-20 07:57:42
2660
发布2023-03-20 07:57:42
举报
文章被收录于专栏:孟君的编程札记

前段时间已经把创建型和结构型模式都撸了一遍,从今天开始,我们进入行为型模式的篇幅。今天分享是:迭代器模式。

迭代器模式是一种行为型模式,它允许我们遍历一个集合对象的元素而不必暴露该集合对象的底层表示方式。该模式将遍历算法和集合对象分离开来,这使得我们可以更容易地改变遍历算法而不影响集合对象,也可以更容易地改变集合对象而不影响遍历算法。

在平时我们会遇到需要顺序访问一个对象集的元素的场景,比如:老师按照名单进行点名;去图书馆,在某一栏书架上从左到右或者从右到左查找想要借的书;又如开车的时候,想听音乐或者收音机电台,一个个地查找等等。

这种一个一个遍历的场景就是今天我们要讲的迭代器模式。在Java语言的聚集(Collection)框架中,广泛使用了迭代器来遍历聚集的元素。

接下来,我们给出迭代器模式的基本介绍以及相关的示例。

迭代器器模式介绍

意图

提供一种方法顺序访问一个聚合对象中各个元素,而不是暴露该对象的内部表示。

结构

迭代器模式的基本结构如下:

图片
图片

这里涉及到的参与者有如下几种:

Iterator(迭代器)

迭代器定义访问和遍历元素的接口

ConcreteIterator(具体迭代器)

  • 具体迭代器实现迭代器接口
  • 对该聚合遍历时跟踪当前位置

Aggregate(聚合)

聚合定义创建相应迭代器对象接口

ConcreteAggregate(具体聚合)

具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例

迭代器器模式示例

接下来,我们编写List / Array等迭代器,然后对一个Music实体列表进行遍历。

1、List迭代器示例

Iterator迭代器

图片
图片

具体Iterator迭代器

图片
图片

Aggregate(聚合)

图片
图片

ConcreteAggregate(具体聚合)

图片
图片

Music类

图片
图片

客户端Client

图片
图片

输出結果:

图片
图片

这样,一个简单的列表(List)迭代器模式示例就完成了。

上述,代码,List迭代器应该为public class,所以能直接创建使用。如:

代码语言:javascript
复制
Iterator<Music> musicListIetrator =       new ListIterator<Music>(musicList);

我们调整一下,把它作为内部类封装在MyList中,这样迭代器只能通过MyList对象的iterator()方法创建。修改后的MyList代码如下:

图片
图片

2、Array迭代器示例

第二个例子我们使用Array迭代器,来完成。

ConcreteAggregate(具体聚合),包含具体迭代器

图片
图片

客户端client

图片
图片

同样,一个简单的数组(Array)迭代器模式示例就完成了。

小结

在上面的示例中,我们写了List和Array的迭代器。其实,只要有多个数据的聚集,无论是List、Array、Set、图、树等,顺序的访问都可以使用迭代器来实现。如下就是一个树的前序、中序和后序列迭代的实现,有兴趣的读者也可以自己写写。

图片
图片

另外,我们知道在js可以使用异步遍历。在 Java 中,如果想要实现异步迭代器,可以使用 AsyncIterator 接口和 Supplier 函数式接口。在异步迭代器中,我们可以使用 Supplier<CompletableFuture<T>> 来表示下一个元素。有兴趣的读者也可以写一个异步迭代器试试。

优缺点

优点:

  • 迭代器模式简化了聚集的界面。迭代器具备了一个遍历接口,这样聚集的接口就不必具备遍历接口。
  • 每一个聚集对象都可以有一个或一个以上的迭代器对象,每一个迭代器的迭代状态可以是彼此独立的。因此,一个聚集对象可以同时有几个迭代在进行之中,比如一个顺序迭代器、一个逆序迭代器等,就可以支持不同的遍历。
  • 由于遍历算法被封装在迭代器对象,因此,不必知道聚集对象的类型,就可以读取和遍历聚集对象。这样即便聚集对象的类型发生变化,也不会影响到客户端的遍历过程。

缺点:

  • 迭代器模式给客户端一个聚集被顺序化的错觉,因为大多数的情况下聚集的元素并没有确定的顺序,但是迭代必须以一定线性顺序进行。如果客户端误以为顺序是聚集本身具有的特性而过度依赖于聚集元素的顺序,很可能得出错误的结果。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 迭代器器模式介绍
  • 迭代器器模式示例
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档