2013-05-20 22 views
5

Iterator模式定义:提供一种方法来访问聚合对象的顺序的元件不暴露其底层表示。 维基为什么公开底层表示的迭代器不好?

什么是露出底层表示的后果是什么?

为了提供更详细的解答:迭代器模式如何预防呢?每

+4

简而言之,您(用户)对'ArrayList','HashMap','HashSet','TreeSet'使用'Iterator'。你不关心 –

回答

5

由于:http://www.oodesign.com/iterator-pattern.html

迭代器模式的想法是采取访问和传递槽收集的对象的责任,并把它的迭代器对象。 迭代器对象将维护迭代的状态,跟踪当前项目并且有一种方法来标识接下来要迭代的元素。

,你可以从这种模式得到一些好处:

  1. 使用迭代器模式代码设计者可以决定是否允许1次迭代(使用next()只),或允许反向迭代以及(使用上一页()在ListIterator中)。
  2. 是否允许删除对象,如果是,那么如何。
  3. 当物体被移除时维持内部管家。
  4. 它允许您暴露遍历集合的常见机制,而不是期望您的客户了解底层集合。
1

如果底层的表示被暴露,客户端代码可以连接到它。然后:

  • 如果表示发生变化,可能需要更改与其耦合的所有代码。
  • 如果你想遍历一个不同类型的容器,可能需要将代码耦合改变旧的容器。

数据抽象使得代码更有弹性,以表示的变化。

+0

背后的实现,你能提供一个你正在谈论的每一个子弹的例子,也就是说,在行动中看到这种后果将是美好的。 – lmiguelvargasf

1

简而言之:如果您决定更改表示法,则所有依赖于基础表示法的代码都有可以更改。例如,您决定首先使用TreeMap,但您不想再订购(大多数情况下),因此您更改为HashMap。有人正在通过你的地图循环试图获得越来越多的列表。 !

使用迭代器模式,你总是可以给用户的能力,通过循环使用的东西一定的逻辑关系(或者只是随机的,这是一种逻辑的),不知道它是什么引擎盖下。

现在,如果您使用HashMap而不是TreeMap,则可以向用户展示已排序的视图。如果你提供这个SortedIterator并告诉用户“使用这将保证结果被排序,但我不能告诉你任何有关下面的内容”,你可以改变表示为任何你喜欢的,只要这个合同SortedIterator由您维护。

相关问题