5

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

暴露底层表征的后果是什么?

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

4

3 回答 3

5

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

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

您可以从这种模式中获得的一些好处:

  1. 使用 Iterator 模式代码设计者可以决定是允许单向迭代(仅使用 next())还是允许反向迭代(在 ListIterator 中使用 prev())。
  2. 是否允许移除对象,如果是,那么如何。
  3. 当物体被移走时,保持内部清洁。
  4. 它允许您公开遍历集合的通用机制,而不是期望您的客户了解底层集合。
于 2013-05-20T17:09:20.090 回答
1

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

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

数据抽象使代码对表示的变化更具弹性。

于 2013-05-20T17:09:25.107 回答
1

简而言之:如果您决定更改表示,则必须更改依赖于底层表示的所有代码。

例如,您一开始决定使用TreeMap,但后来您不想再订购(在大多数情况下),所以您更改为HashMap. 有人正在遍历您的地图,试图获取越来越多的列表。!!

使用迭代器模式,您始终可以让用户能够以某种逻辑(或者只是随机的,这是一种逻辑)循环遍历某些东西,而无需知道它在幕后是什么。

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

于 2013-05-20T17:09:31.520 回答