迭代器模式:
迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF 给出的定义为:提供一种方法顺序访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节
迭代器(Iterator)模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。迭代器模式在访问数组、集合、列表等数据时,尤其是数据库操作时,是非常普遍的应用,但由于它太普遍了,所以各种高级语言都对它进行了封装,所以反而给人感觉此模式本身不太常用了。
-
迭代器模式可以为不同容器提供一致的遍历行为,而且不用关心内部元素的组成结构,属于行为型模式。
-
迭代器模式的本质就是抽离集合对象迭代行为到迭代容器中,并提供统一的访问接口。
-
迭代器模式是针对集合对象而生的,对于集合对象而言,肯定会涉及到对集合的添加和删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作放在集合对象中,但这样的话,集合对象既承担太多的责任了,面向对象设计原则中有一条就是单一职责原则,所有我们要尽可能地分离这些职责,用不同的类取承担不同的责任,迭代器模式就是用迭代器类来承担遍历集合的职责。
结构图:
优点:
-
解耦了迭代与集合
迭代器模式封装具体的迭代算法,即使迭代器内部算法发生变化,也不会影响到原有的集合对象。
-
简化了集合对象接口
迭代器模式将集合对象本身应该提供的元素迭代接口放到了迭代器中,使得集合对象可以无需关心具体的迭代行为。
-
多态迭代
迭代器模式为不同聚合结构的集合提供了一致的遍历接口,即一个迭代器可以用来迭代不同的集合对象。
-
元素迭代功能的多样化
每个集合可以提供一个或者多个不同功能的迭代器,使得同种元素可以有不同的迭代行为。
缺点:
-
迭代器模式如果用于简单的数据结构(如数组或者链表)时,反而会使得迭代元素方式变得更加繁琐复杂化。
适用场景:
-
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。
-
需要对聚集有多种方式遍历时,可以考虑用迭代器模式。
-
为遍历不同的聚合结构提供一个统一的接口。
迭代器模式常与组合模式结合起来使用:
在对组合模式中的容器构件进行访问时,经常将迭代器潜藏在组合模式的容器构成类中。当然,也可以构造一个外部迭代器来对容器构件进行访问,其结构图如下: