Iterator模式产生原因和实例分析

2022-09-11

1 问题的提出

Iterator模式,也称迭代器模式,或迭代子模式。GOF对Iterator模式的意图是:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露聚合对象的内部表示。

在Java中,如果采用数组解决业务需求,一般可用如下的方式:

当应用逻辑发生变化,改用java.util.Listlst存储,遍历的代码发生变化。

上面两段代码发现:遍历方法和存储数据结构耦合太强。数据没有发生变化,遍历和存储数据的代码完全不一样。函数it Array()中,采用a[i]的方式遍历数据;函数it List()中,却采用lst.get(i)方式遍历数据。可以想象,数据存放在文本文件中时遍历数据肯定又不一样。

为访问文本文件中数据,程序逻辑如下:

由此可见,当数据的存储方式可能发生变化会导致遍历数据的代码千差万别。然而,客户端真正感兴趣的是如何方便的访问数据,而不关心数据是如何存储的。上面无论哪一种方法,客户端都必须知道聚合对象的内部结构。因此,需要有一种手段保证:即使存储数据的结构变化了,访问数据的方式也不要发生变化。这个就是Iterator模式的由来。

2 Iterator模式概述

Iterator模式的结构如下图所示,包括了可复用部分、接口部分和不可复用部分。

Iterator模式的关键思想在于:把对聚合对象的访问从聚合对象中分离出来,并放入一个迭代器对象中。Iterator接口定义了一个访问Aggregate元素的接口。Iterator对象负责跟踪Aggregate中的当前元素,比较好的避免了聚合对象内部细节的暴露。

Iterator模式一般由三个部分构成:可复用部分、接口部分、不可复用部分。

采用Iterator模式以后,由于客户端只与接口建立联系,所以,客户端代码就变成了可复用代码。

接口部分部分是客户端和具体类的过渡层。其中Aggregate是抽象聚合接口,定义了创建相应迭代器对象的方法;Iterator是抽象迭代器接口,定义了访问和遍历Aggregate中元素的方法。

不可复用部分就是具体类部分。其中Concrete Aggregate是具体聚合类,实现了Aggregate接口;Concrete Iterator是具体迭代器,实现了Iterator接口。

3 Iterator模式的具体应用

Iterator模式能够有效地将遍历机制和聚合对象分离。因此可以采用Iterator模式解决由于存储数据的数据结构不同,而造成客户端访问代码千差万别的问题。

3.1 实例UML图

下面的U M L图,显示了抽象接口A ggregate和Iterator,以及它们的实现类ArrayAggregate、ListAggregate、File Aggregate和ArrayIterator、List Iterator、File Iterator之间的关系。

3.2 不可复用部分

不可复用部分主要是实现Aggregate接口和Iterator接口的具体类,一共有三种:分别是基于Array、List和File的具体应用。

3.2.1 基于Array实现的具体类

类Array Aggregate实现Aggregate接口,用int[]a存储数据。

方法iterator()返回了与类Array Aggregate强耦合的Array Iterator的实例。由于客户端通过Array Iterator的实例操作Array Aggregate,隐藏了Array Aggregate的实现细节。

类Array Iterator实现Iterator接口。在构造函数中,传递了与该类强耦合的类Array Aggregate的实例。具体可以参照File实现的具体类。

3.2.2 基于List实现的具体类

类List Aggregate实现Aggregate接口,用L i s tl s t存储数据。类List Iterator实现Iterator接口。具体可以参照File实现的具体类。

3.2.3 基于File实现的具体类

  类File Aggregate同样实现了Aggregate接口。

  类File Iterator实现了Iterator接口。构造函数传递File Aggregate类型。

3.3 可复用部分

  下面看看客户端的代码:

  由构造函数Client(Aggregate at);可以看出:对聚合对象的访问几乎与数据的存储方式没有任何关系,在Iterator模式中得到了统一的客户端代码。

  采用Iterator模式以后,通过Aggregate接口和Iterator接口,提高了客户端代码的复用程度。

4 结语

  Iterator模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。此外提供统一接口遍历不同的聚合,也简化了聚合接口。

摘要:讨论Iterator模式的产生原因和具体应用分析。利用Iterator模式提供了顺序访问聚合对象中各个元素,而又不需暴露该对象的内部表示的特点,解决了客户端代码无法重用的问题。对Iterator模式的适用性和对聚合接口的简化也做了一定程度的说明。

关键词:设计模式,Iterator模式,聚合对象

参考文献

[1] 伽玛,等著.设计模式:可复用面向对象软件的基础[M].机械工业出版社,2000,9.

[2] 结城洁著.设计模式:Java语言中的应用,博硕文化译[M].中国铁道出版社,2005,06.

[3] (美)梅特斯克,(美)韦克著,龚波,等译.J a v a设计模式[M].人民邮电出版社,2007,03.

上一篇:关于医患关系适用消费者权益保护法分析下一篇:抗痨药物联合免疫调节剂治疗老年肺结核合并糖尿病的疗效