迭代器模式介绍
迭代器模式又称为游标模式。是行为设计模式之一。
迭代器模式的定义
它提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。
迭代器模式中的角色
- Iterator(迭代器)
该角色负责定义按顺序逐个遍历元素的接口(API)。一般定义一个返回Iterator的函数。 - ConcreteIterator(具体的迭代器)
该角色负责实现Iterator所定义的接口。 - Aggregate(集合)
该角色负责定义创建Iterator的接口(API)。 - ConcreteAggregate(具体的集合)
该角色负责实现Aggregat角色所定义的接口。
扩展思路要点
- 不管实现如何变化,都可以使用Iterator。
为什么一定要考虑引入Iterator呢?如果是数组/集合,直接for循环语句进行遍历处理不就可以了吗?为什么要在集合之外引入Iterator这个角色呢?
一个重要的理由是,引入Iterator后可以将遍历与实现分离开来。可以看下面的代码。
while(it.hasNext()) { Book book = it.next(); }
这里只使用了Iterator的hasNext方法和next方法,并没有调用 具体集合的方法。也就是说,这里的while循环不依赖具体集合的实现。 - 难以理解抽象类和接口
很难理解抽象类和接口的人常常使用ConcreteAggregate角色和ConcreteIterator角色编程 ,而不使用Aggregate接口和Iterator接口,他们总想使用具体的类来解决所有问题。(我就是这样啊!!!)
如果只是用具体的类来解决问题,很容易导致类之间的强耦合,这些类也难以作为组件被再次利用。为了弱化类之间的耦合,进而使得类更加容易作为组件被再次利用,我们需要引入抽象类和接口。
切记"不要使用具体类来编程,要优先使用抽象类和接口来编程"。 - 容易弄错的下一个
在Iterator模式的实现中,很容易弄错next()。该方法返回的返回值到底是当前元素还是下一个元素??更详细的说,next方法的名字应该是下面这样的:
return CurrentElementAndAdvanceToNextPosition
也就是说,next方法是"返回当前的元素,并指向下一个元素"。同理hasNext则表示接下来是否可以调用next方法。