java中的迭代器模式

以下是我现阶段对迭代器模式的理解


当我们要创建一个集合对象,例如List,Set,Map等,用于存储另外一个对象时,我们很大机率会有遍历这个集合对象的需求。这个时候我们经常会很简单的想到,直接创建实例集合对象,然后用for循环去遍历这个对象。但当你这样去做的时候,你会发现,当你需要遍历这个集合对象的时候,你必须依赖于该集合对象里的方法。

这里我用书架对象,和书对象,举例说明。




以上代码分别创建了,书对象,和书架对象。

其中书架对象以数组的方式,实现对书对象的存储。

下面是调用者。我要查阅书架里所有书的名称:


观察可发现,我在调用的时候,直接依赖了书架实例里面的两个方法,getLength()和getBookAt(int index)。

这样的缺点可以想象,如果随着图书的增多,或者其他原因。我书架需要改造。也就是说我的bookShelf实体类其中的属性,或者方法,可能会发生变化。这样当我改造bookShelf类中的方法或者属性的时候,我就会非常的担心,甚至可以说不敢去做改动。因为我这个类中的方法,都被其他的类直接引用着呢,我一改,其他调用者就很难保证自己不需要跟着做改动。


为了解决这种问题。我们的迭代器模式就登场了,先看一下登场角色:


1.Iterator(迭代器)

该角色负责定义按顺序逐个遍历元素的接口(api)。在将要展示的代码中,由Iterator接口扮演这个角色,他定义了hasNext和next两个方法。其中,hasNext方法用于判断是否存在下一个元素,next方法则用于获取该元素。


2.ConcreteIterator(具体的迭代器)

该角色负责实现Iterator角色所定义的接口(api)。在将要展示的代码中,由BookShelfIterator类扮演这个角色。该角色中,包含了遍历集合所必须的信息。在示例中,BookShelf类的实例保存在bookShelf字段中,被指向的书的下标保存在index字段中。


3.Aggregate(集合)

这个集合你可以理解为Connection,该角色负责定义创建Iterator角色的接口(api)。这个接口(api)是一个方法,会创建出"按顺序访问保存在我内部元素的人"。在示例中,由Aggregate接口扮演这个角色,他里面定义了Iterator方法。


4.ConcreteAggregate(具体的集合)

这个你可以理解为ArrayList,HashSet等具体的集合类,该角色负责实现Aggregate角色所定义的接口(api)。他会创建出具体的Iterator角色,即ConcreteIterator角色。在示例中,由bookShelf类扮演这个角色,他实现了iterator方法。


先把整个的结构截图发一下



1.集合


2.迭代器


3.Book类


4.具体集合类BookShelf


5.具体的迭代器BookShelfIterator类


6.调用者Main类



到此所有的展示代码就展示完了。

回过头来。还记得我们要解决的问题吗?

我们要查询书架中书的名称。但是之前我们在查询过程中。严重的依赖了书架本身的一些方法。如果书架被改造等发生,他的调用者是会受影响的。

通过以上方式的设计模式。解决了对书架类依赖的硬编码。这样编写BookShelf的开发人员决定放弃用数组来管理书本,而是用java.util.Vector取而代之时,不管BookShelf如何变化,只要BookShelf的iterator方法能正确的返回Iterator的实例(也就是说,返回的Iterator类的实例没有问题,hasNext和next方法都可以正常工作),即使不对上面的while循环做任何修改,代码都可以正常工作。

好好理解一下,为什么Iterator方法的返回值不是BookShelfIterator类型而是Iterator类型,他表明了,这段程序就是要使用Iterator的方法进行编程,而不是BookShelfIterator的方法。




发布了21 篇原创文章 · 获赞 17 · 访问量 8648
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章