Что такое паттерн "Итератор" (Iterator)

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

Представьте, что у вас есть сложная структура данных, например, дерево или список, и вы хотите предоставить пользователям простой интерфейс для прохода по её элементам. Итератор создаёт абстракцию, которая позволяет это делать последовательно и безопасно.

Преимущества паттерна «Итератор»

  • Упрощает обход сложных структур данных.
  • Отделяет логику перебора от самой коллекции.
  • Позволяет использовать один интерфейс для разных коллекций.
  • Поддерживает несколько вариантов обхода (например, прямой, обратный).

Пример:

  • Коллекция: список чисел.
  • Итератор обеспечивает последовательный доступ к элементам.
  • Клиент использует итератор для перебора без знания внутренностей коллекции.

Где применяется паттерн «Итератор»?

  • В стандартных библиотеках коллекций.
  • В обходе структур данных (деревья, графы).
  • При реализации циклов по элементам без раскрытия деталей.

Пример реализации на JavaScript

// Коллекция class NumberCollection { constructor() { this.items = []; } add(item) { this.items.push(item); } createIterator() { return new NumberIterator(this); } } // Итератор class NumberIterator { constructor(collection) { this.collection = collection; this.current = 0; } hasNext() { return this.current < this.collection.items.length; } next() { return this.collection.items[this.current++]; } } // Использование const collection = new NumberCollection(); collection.add(1); collection.add(2); collection.add(3); const iterator = collection.createIterator(); while (iterator.hasNext()) { console.log(iterator.next()); }

Когда стоит использовать паттерн «Итератор»?

  • Нужно скрыть внутреннюю структуру коллекции.
  • Требуется последовательный доступ к элементам.
  • Желательно поддерживать несколько способов обхода.
  • Хотите предоставить простой интерфейс для перебора.

Отличие от других паттернов

  • В отличие от перечислений (enumerator) или индексов, Итератор инкапсулирует состояние обхода.
  • Отличается от наблюдателя тем, что обеспечивает проход по элементам, а не реагирует на события.

Плюсы паттерна

  • Универсальный интерфейс обхода для различных коллекций.
  • Упрощает клиентский код.
  • Позволяет реализовать несколько видов обхода.
  • Скрывает детали реализации коллекций.

Минусы паттерна

  • Увеличивает количество классов и объектов.
  • Может быть избыточен для простых коллекций с небольшим количеством элементов.