首页 > 应用开发 > Java > 设计模式之迭代器模式
迭代器模式的定义是 通过提供一种方法顺序访问一个聚合对象中的各个元素,而又不必暴露该聚合对象中的内部表示。迭代器模式是针对聚合对象(数组、集合、链表)的“访问”而来。通过定义不同的遍历策略来遍历聚合对象。
应用场景
UML图
迭代器模式中涉及的角色:
在Iterator接口中定义了聚集对象需要的遍历操作。
在上面的实例中,我们可以看到在具体聚集中,我们定义了与Iterator对象的方法,用来封装具体的操作。以便在Iterator的具体实例中进行调用,同时我们也封装了一个生成Iterator的方法。
在具体迭代器中定义包含一个聚集对象的实例,即对这个聚集对象进行相应操作的访问。
客户端
在上面的客户端中,首先创建一个聚集类实例,然后调用iterator方法得到一个迭代器角色,得到迭代器角色后,我们就可以进行相关的遍历操作。
通过上面的实例演示,我们可以得到以下几点列:
在上面的例子中,既然聚集内部已经提供了相应的操作方法,那么我们还要使用迭代器模式呢?确实,客户端可以根据聚集提供的接口来进行遍历操作,但是,迭代器模式将迭代进行了抽象好,具有更好的扩展性,因为集合对象内部结构多变,使用迭代器模式可将客户端和聚集的责任分割开,使得两者可独立演变,迭代器模式作为中间层,可以吸收变化因素,避免客户端的修改。
外部迭代器 指的是由客户端来控制迭代下一个元素的步骤,客户端会显式调用迭代器的next()等迭代方法,在遍历过程中向前进行。
内部迭代器 指的是由迭代器自己来控制迭代下一个元素的步骤。因此,如果想要在迭代的过程中完成工作的话,客户端就需要把操作传递给迭代器,迭代器在迭代的时候会在每个元素上执行这个操作,类似于JAVA的回调机制。
总体来说外部迭代器比内部迭代器要灵活一些,因此我们常见的实现多属于主动迭代子。
如果一个聚集的接口没有提供修改聚集元素的方法,这样的接口就是所谓的窄接口。
聚集对象为迭代器提供了一个宽接口,为其它对象提供窄接口来访问。即聚集对象对迭代器是适当公开的,以便迭代器对聚集对象有足够的了解,从而可以进行迭代操作。但是聚集对象应该避免向其它对象提供这些方法,其它对象应该通过迭代器完成这些操作,不能直接操作聚集对象。
在Java中,实现这种双重限制接口的办法就是通过内部类来实现,即将迭代器对象设置为聚集类的内部类,这样迭代器对象可以对聚集类有很好的访问,同时又限制了对外的操作。 这种同时保证聚集对象的封装和迭代子功能的实现的方案叫做黑箱实现方案。 而这种形式定义的迭代器,又被称为内部迭代器。
如下面的例子所示:
静态迭代器 静态迭代子由聚集对象创建,并持有聚集对象的一份快照(snapshot),在产生后这个快照的内容就不再变化。客户端可以继续修改原聚集的内容,但是迭代子对象不会反映出聚集的新变化。
静态迭代子的好处是它的安全性和简易性,换言之,静态迭代子易于实现,不容易出现错误。但是由于静态迭代子将原聚集复制了一份,因此它的短处是对时间和内存资源的消耗。
动态迭代器 动态迭代子则与静态迭代子完全相反,在迭代子被产生之后,迭代子保持着对聚集元素的引用,因此,任何对原聚集内容的修改都会在迭代子对象上反映出来。
完整的动态迭代子不容易实现,但是简化的动态迭代子并不难实现。大多数JAVA设计师遇到的迭代子都是这种简化的动态迭代子。为了说明什么是简化的动态迭代子,首先需要介绍一个新的概念: Fail Fast。
Fail Fast 如果一个算法开始之后,它的运算环境发生变化,使得算法无法进行必需的调整时,这个算法就应当立即发出故障信号。这就是Fail Fast的含义。
如果聚集对象的元素在一个动态迭代子的迭代过程中发生变化时,迭代过程会受到影响而变得不能自恰。这时候,迭代子就应当立即抛出一个异常。这种迭代子就是实现了Fail Fast功能的迭代子。
Fail Fast在JAVA聚集中的使用 JAVA语言以接口java.util.Iterator的方式支持迭代子模式,Collection接口要求提供iterator()方法,此方法在调用时返还一个Iterator类型的对象。而作为Collection接口的子类型,AbstractList类的内部成员类Itr便是实现Iterator接口的类。
优点
缺点
一直想整理出一份完美的面试宝典,但是时间上一直腾不开,这套 一千多道面试题宝典,结合今年金三银四各种大厂面试题,以及 GitHub 上 star 数超 30K+ 的文档整理出来的,我上传以后,毫无意外的短短半个小时点赞量就达到了 13k,说实话还是有点不可思议的。
需要完整版的小伙伴,可以一键三连后, 点击这里!
内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技术栈(485页)
内容涵盖:Java基础、JVM、高并发、多线程、分布式、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、数据库、云计算等
由于篇幅限制,详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
需要完整版的小伙伴,可以一键三连后, 点击这里!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70000428/viewspace-2787786/ ,如需转载,请注明出处,否则将追究法律责任。