前段时间已经把创建型和结构型模式都撸了一遍,从今天开始,我们进入行为型模式的篇幅。今天分享是:迭代器模式。
迭代器模式是一种行为型模式,它允许我们遍历一个集合对象的元素而不必暴露该集合对象的底层表示方式。该模式将遍历算法和集合对象分离开来,这使得我们可以更容易地改变遍历算法而不影响集合对象,也可以更容易地改变集合对象而不影响遍历算法。
在平时我们会遇到需要顺序访问一个对象集的元素的场景,比如:老师按照名单进行点名;去图书馆,在某一栏书架上从左到右或者从右到左查找想要借的书;又如开车的时候,想听音乐或者收音机电台,一个个地查找等等。
这种一个一个遍历的场景就是今天我们要讲的迭代器模式。在Java语言的聚集(Collection)框架中,广泛使用了迭代器来遍历聚集的元素。
接下来,我们给出迭代器模式的基本介绍以及相关的示例。
意图
提供一种方法顺序访问一个聚合对象中各个元素,而不是暴露该对象的内部表示。
结构
迭代器模式的基本结构如下:
这里涉及到的参与者有如下几种:
Iterator(迭代器)
迭代器定义访问和遍历元素的接口
ConcreteIterator(具体迭代器)
Aggregate(聚合)
聚合定义创建相应迭代器对象接口
ConcreteAggregate(具体聚合)
具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例
接下来,我们编写List / Array等迭代器,然后对一个Music实体列表进行遍历。
1、List迭代器示例
Iterator迭代器
具体Iterator迭代器
Aggregate(聚合)
ConcreteAggregate(具体聚合)
Music类
客户端Client
输出結果:
这样,一个简单的列表(List)迭代器模式示例就完成了。
上述,代码,List迭代器应该为public class,所以能直接创建使用。如:
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 删除。