Что такое паттерн "Итератор" (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) или индексов, Итератор инкапсулирует состояние обхода.
- Отличается от наблюдателя тем, что обеспечивает проход по элементам, а не реагирует на события.
Плюсы паттерна
- Универсальный интерфейс обхода для различных коллекций.
- Упрощает клиентский код.
- Позволяет реализовать несколько видов обхода.
- Скрывает детали реализации коллекций.
Минусы паттерна
- Увеличивает количество классов и объектов.
- Может быть избыточен для простых коллекций с небольшим количеством элементов.