大家好,欢迎来到IT知识分享网。
一、概念
迭代器模式,最常见的就是开发中使用JDK自带的Iterator 遍历集合。这个模式在我们实际开发中用的场景并不多。另外增强的for循环虽然是循环输出数据,但是他不是迭代器模式, 迭代器具备对元素的删除等操作。而增强for循环是不可以的。
迭代器模式(Iterator Pattern)又称为游标者模式(Cursor Pattern)。迭代器模式剥离集合对象迭代行为到迭代器中,并提供统一的访问接口
- 意图 :分离集合对象的遍历行为(功能),即我们无需关心该集合的底层结构是什么样子的。只要拿到相应的迭代器就可以遍历这个对象。
- 主要解决:1.为遍历不同的聚合结构提供一个统一的接口 2.通过该接口实现不同的方式来遍历聚合对象。
一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的List、Set、Map等,这些集合都有自己的迭代器。
二、适用场景
-
访问一个
集合对象
的内容而无需暴露它的内部实现
。 -
支持对聚合对象的多种遍历。
-
为遍历不同的聚合结构提供一个统一的接口。
-
- 聚合对象:存储数据
- 迭代器:遍历数据
三、参与者
- 抽象迭代器角色(Iterator):
负责定义访问和遍历元素的基本接口
。- 一般来说迭代器会提供3个方法:
- next():获取下一个元素
- hasNext():是否存在下一个元素,用于判断是否遍历结束
- remove():移除当前对象
- 具体迭代器角色(Concrete Iterator):实现迭代器接口定义的方法,记录遍历中的当前位置,完成集合的具体迭代行为(功能)。
- 抽象容器角色(Container) :负责定义提供创建具体迭代器角色的接口
- 一般是一个接口,提供一个
terator();
方法用于获取迭代器,如:Java中的Collection接口,List接口,Set接口在上层都是实现了Iterable<T>接口并重写iterator()方法
- 一般是一个接口,提供一个
- 具体容器角色(Concrete Container):就是抽象容器的具体实现类
- 比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList等待
四、代码例子
ConcreteAggregate对象用来保存数据,新建一个针对其的迭代器用来遍历所有数据
- 抽象迭代器角色(Iterator):Iterator
- 具体迭代器角色(Concrete Iterator):ConcreteIterator
- 抽象容器角色(Container) :Aggregate
- 具体容器角色(Concrete Container):ConcreteAggregate
五、UML图
六、优缺点
(一)优点
- 解耦了集合的数据存储与
数据遍历
行为,由迭代器负责封装具体的遍历算法
,即使迭代器内部算法发生变化,也不会影响到原有的集合对象。 - 多态迭代。为不同聚合结构的集合提供了一致的
遍历接口
,即一个迭代器可以用来迭代不同的集合对象。
- 即:可以以相同的⽅式,遍历不同的数据结构元素,这些数据结构包括; 数组 、 链表 、 树 等,⽽⽤户在使⽤遍历的时候并不需要去关⼼每⼀种数据结构的遍历处理逻辑(遍历算法),从让使⽤变得统⼀易⽤
- 元素迭代功能的多样化。
每个集合可以提供一个或者多个不同功能的迭代器
,使得同种元素可以有不同的迭代行为。- 即:可以提供多种遍历方式,如有序列表,可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
- 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
(二)缺点
- 由于迭代器模式将存储数据 和 遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加(设计模式都有的问题),这在一定程度上增加了系统的复杂性。
- 对于比较简单的遍历使用迭代器方式遍历较为繁琐,像数组或者有序列表,我们宁可愿意使用for循环和get方法来遍历集合。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30855.html