Дает возможность последовательно обойти все элементы составного объекта, не раскрывая его внутреннего представления.

 Назначение

Предоставляет способ последовательного доступа ко всем элементам составного объекта, не раскрывая его внутреннего представления

Применимость

Используйте паттерн итератор:

  • для доступа к содержимому агрегированных объектов без раскрытия их внутреннего представления
  • для поддержки нескольких активных обходов одного и того же агрегированного объекта
  • для предоставления единообразного интерфейса с целью обхода различных агрегированных структур

Результаты

У паттерна итератор есть следующие важные особенности:

  • поддерживает различные виды обхода агрегата. Сложные агрегаты можно обходить по-разному. Например, для генерации кода и семантических проверок нужно обходить деревья синтаксического разбора. Итераторы упрощают изменение алгоритма обхода - достаточно просто заменить один экземпляр итератора другим. Для поддержки новых видов обхода можно определить и подклассы класса Iterator;
  • итераторы упрощают интерфейс класcа Aggregate. Наличие интерфейса для обхода в классе Iterator делает излишним дублирование этого интерфейса в классе Aggregate. Тем самым интерфейс агрегата упрощается;
  • одновременно для данного агрегата может быть активно несколько обходов. Итератор следит за инкапсулированным в нем самом состоянием обхода. Поэтому одновременно разрешается осуществлять несколько обходов агрегата.

Структура

Участники

  • Iterator - итератор: определяет интерфейс для доступа и обхода элементов;
  • ConcreteIterator - конкретный итератор: реализует интерфейс класса Iterator и следит за текущей позицией при обходе агрегата;
  • Aggregate - агрегат: определяет интерфейс для создания объекта итератора;
  • ConcreteAggregate - конкретный агрегат: реализует интерфейс создания итератора и возвращает экземпляр подходящего класса ConcreteIterator