2013-05-20 2 views
5

Iterator Pattern Definition: Предоставляет способ доступа к элементам агрегатного объекта последовательно, не подвергая его базовому представлению. WikiПочему подвергает итераторам представление плохое?

Каковы последствия воздействия на базовое представление?

Чтобы предоставить более подробный ответ: Как шаблон итератора предотвращает это?

+4

Короче говоря, вы (пользователь) используете 'Iterator' одинаково для' ArrayList', 'HashMap',' HashSet', 'TreeSet'. Вы не заботитесь о реализации за –

ответ

5

По: http://www.oodesign.com/iterator-pattern.html

Идея картины итератора должен взять на себя ответственность за доступ и прохождение корыта объектов сбора и поместить его в объект итератора. Объект итератора будет поддерживать состояние итерации, отслеживая текущий элемент и способ идентифицировать, какие элементы находятся рядом с итерацией.

Мало преимуществ, которые вы можете получить от этой модели:

  1. Использование итератора кода шаблон дизайнер может решить, следует ли разрешить 1 способ итерации (с помощью следующей() только) или разрешить обратной итерации, а также (с помощью пред(), как в ListIterator).
  2. Разрешить удаление объекта или нет, если да, то как.
  3. Ведение домашнего хозяйства при удалении объекта.
  4. Это позволяет вам выявить общий механизм перемещения коллекции, а не ожидать, что ваши клиенты поймут базовые коллекции.
1

Если основное представление было выставлено, клиентский код мог бы соединиться с ним. Затем:

  • Если представление изменяется, может потребоваться изменить всю связь кода с ним.
  • Если вы хотите перебирать другой тип контейнера, может потребоваться изменить кодовое соединение на старый контейнер.

Абстракция данных делает код более упругим для изменения представления.

+0

, можете ли вы привести пример каждой пули, о которой вы говорите, т. Е. Было бы замечательно увидеть в действии эти последствия. – lmiguelvargasf

1

Вкратце: весь код, основанный на базовом представлении, будет иметь, который будет изменен, если вы решите изменить представление.

Например, вы решили сначала использовать TreeMap, но тогда вы больше не хотите заказывать (в большинстве случаев), поэтому вы меняете на HashMap. Кто-то зацикливается на вашей карте, пытаясь получить все больший список. !!

Использование шаблона итератора, вы всегда можете дать пользователю возможность прокручивать что-то с помощью определенной логики (или просто случайной, что является своего рода логикой), не зная, что находится под капотом.

Теперь, если вы используете HashMap вместо TreeMap, вы можете просмотреть отсортированное представление для пользователя.Если вы сообщите об этом SortedIterator и сообщите пользователю, «используя это, вы гарантируете, что результат будет отсортирован, но я ничего не могу сказать о том, что находится под ним», вы можете изменить представление так, как вам нравится, если контракт этого SortedIterator поддерживается вами.

Смежные вопросы