【问题标题】:Why is exposing an iterators underlying representation bad?为什么暴露底层表示的迭代器不好?
【发布时间】:2013-05-20 17:06:00
【问题描述】:

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

暴露底层表示会有什么后果?

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

【问题讨论】:

  • 简而言之,您(用户)使用Iterator 的方式与ArrayListHashMapHashSetTreeSet 相同。你不关心背后的实现

标签: java design-patterns iterator


【解决方案1】:

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

迭代器模式的思想是负责访问和传递集合中的对象,并将其放入迭代器对象中。 迭代器对象将保持迭代的状态,跟踪当前项,并有办法确定接下来要迭代的元素。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 您能否提供一个您正在谈论的每个子弹的示例,即,如果在行动中看到这种后果会很棒。
    【解决方案3】:

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

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

    使用迭代器模式,您始终可以让用户能够在不知道引擎盖下的内容的情况下,通过某种逻辑(或者只是随机的,这是一种逻辑)循环遍历某些东西。

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

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2010-09-14
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 2017-06-03
      • 2011-04-25
      相关资源
      最近更新 更多