为什么公开底层表示的迭代器不好?

时间:2013-05-20 17:06:01

标签: java design-patterns iterator

  

Iterator模式定义:提供一种顺序访问聚合对象元素的方法,而不会暴露其底层表示。 维基

公开基础代表会产生什么后果?

提供更详细的答案:迭代器模式如何防止这种情况?

3 个答案:

答案 0 :(得分:5)

根据:http://www.oodesign.com/iterator-pattern.html

迭代器模式的想法是负责访问和传递集合的对象并将其放在迭代器对象中。 迭代器对象将保持迭代的状态,跟踪当前项并有一种方法来识别接下来要迭代的元素。

您可以从这种模式中获得很多好处:

  1. 使用Iterator模式代码设计器可以决定是否允许单向迭代(仅使用next())或允许反向迭代(使用ListIterator中的prev())。
  2. 是否允许删除对象,如果是,那么如何。
  3. 移除物体时保持内部管理。
  4. 它允许您公开遍历集合的常用机制,而不是期望您的客户理解底层集合。

答案 1 :(得分:1)

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

  • 如果表示发生变化,可能需要更改与之耦合的所有代码。
  • 如果要迭代不同类型的容器,可能需要更改与旧容器耦合的代码。

数据抽象使代码更能适应表示的变化。

答案 2 :(得分:1)

简而言之:如果您决定更改表示,则依赖于基础表示的所有代码都将更改

例如,您最初决定使用TreeMap,但之后您不再需要订购(在大多数情况下),因此您更改为HashMap。有人正在遍历你的地图,试图获得越来越多的列表。 !!

使用迭代器模式,你总是可以让用户能够循环使用某种逻辑(或者只是随机的,这是一种逻辑)而不知道它是什么。

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