迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,就是说我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。下面我们来了解一下对于迭代器模式的组成以及在java中迭代器的实现。
迭代器模式(游标模式)
在GOF中给出关于迭代器的定义是:提供了一种方法去访问一个容器对象中的每一个元素,但是又不需要暴露该对象的内部细节。在这个定义中我们可以看出迭代器其实就是为容器而生的。如果你要说在java中最常被使用的模式是哪一个,那可能会是迭代器模式。
在对容器对象进行访问的时候必定会涉及到遍历算法。然而在迭代器模式出现之前有两种情况:
第一种就是你可以把所有的遍历方法放到容器对象中去。但是这样子容器会承受过多的功能,它不仅要自己负责自己内部的元素维护还要提供遍历自身的接口。还有的就是由于遍历状态保存的问题,不能对同一个容器同时进行多个遍历。
第二种方法就更加简单了,不在容器对象中提供遍历算法,让使用的人自己去实现。但是这种方法又会将内部的细节暴露。
所以迭代器就出现了,而且迭代器的出现很好的解决了以上的两个问题。
迭代器模式的组成
1)迭代器角色(Iterator):负责定义访问和遍历元素的接口。
2)具体迭代器角色(Concrete Iterator):它和迭代器角色不同,它主要实现迭代器的接口,并且记录遍历中的当前位置
3)容器角色(Container):负责提供创建具体迭代器角色的接口。
4)具体容器角色(Concrete Container):这个具体迭代器角色是与该容器的结构有关的,它主要实现创建迭代器角色的接口。
要注意的是,后面两个一个是提供接口,一个是实现接口。
而在迭代器模式中的多态迭代,是迭代器模式抽象了具体迭代器角色,这样就可以使得客户程序更具有一般性和重用性。这个多态迭代是用于帮助客户程序从与具体迭代器角色耦合的困境中脱离出来。
我们来看看迭代器模式的类图:
在图中我们可以看出的是,迭代器模式在客户与容器之间加入了迭代器角色。而因为迭代器的加入,才可以很好的解决了容器内部细节暴露的问题,而且也使得设计复合"单一职责原则"。
迭代器模式的优缺点
优点
1)简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
2)可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
3)封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
缺点
对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。
迭代器模式的实现
1)迭代器角色定义了遍历的接口,但是没有规定由谁来控制迭代。而有两种不同的迭代器,一种是外部迭代器另一种是内部迭代器。功能都是顾名思义,前者由客户程序开控制,另一种是由迭代器自身来控制迭代。而外部迭代器要比内部迭代器更加灵活,更加强大。而且内部迭代器在java语言环境中可用性很弱。
2)由于在迭代器模式中并没有规定谁来实现遍历,所以好像理所当然的要在迭代器角色中实现遍历算法。这样做的好处是便于在一个容器上使用不同的算法,也便于将一种算法实现在不同容器上。但是这样有缺点就是这样会破坏点容器的封装,这样子就意味着容器角色就会公开自己私有的属性。那我们把遍历算法放到容器角色中实现,这样迭代器角色就会被架空为仅仅存放一个遍历当前位置的功能。但是遍历算法便和特定的容器紧紧绑在一起了。
实例
Java Collection中的迭代器的实现代码:
迭代器模式的使用
1.客户程序首先先得到具体容器角色
2.然后再通过具体容器角色得到具体迭代器角色。
3.使用具体迭代器角色进行遍历容器。
迭代器给容器的应用的好处
1)支持以不同的方式遍历一个容器角色,但是不同的实现方式会有不同的效果。
2)简化了容器的接口。但是有一个例外就是java Collection,java Collection中为了提高可扩展性,容器还是为其提供了遍历的接口。
3)对同一个容器可以同时进行遍历。
1.在迭代器遍历时通过迭代器进行容器元素的增减操作是够是安全的?
2.迭代器在容器中存在复合对象的情况下怎样才能支持深层的遍历和多种遍历?
最后要说一下的是,由于容器和迭代器的关系太过紧密,所以现在的大多数语言在实现容器的时候都会直接提供迭代器给你,而且一般来说靠语言所提供的这两种就可以完成我们所需要解决的问题了。所以要我们自己去实现迭代器的情况还是很少有的。
上一篇:什么是Qt?
¥299.00
¥399.00
¥29.00
¥498.00