Skip to content

Iterator (Итератор)

Шаблон проектирования "Итератор" (Iterator) предоставляет способ последовательного доступа к элементам коллекции без раскрытия ее внутренней структуры. Этот паттерн позволяет обойтись без необходимости знать, как устроена коллекция, и предоставляет единый интерфейс для перебора элементов.

Основные компоненты паттерна "Итератор":

  1. Итератор (Iterator): интерфейс, который определяет методы для доступа к элементам коллекции.
  2. Конкретный итератор (Concrete Iterator): класс, который реализует интерфейс итератора и управляет текущей позицией в коллекции.
  3. Коллекция (Aggregate): интерфейс, который определяет метод для создания итератора.
  4. Конкретная коллекция (Concrete Aggregate): класс, который реализует интерфейс коллекции и создает конкретный итератор.

Пример на Java

Рассмотрим пример, в котором мы создаем коллекцию строк и итератор для перебора этих строк.

import java.util.ArrayList;
import java.util.List;

// Интерфейс итератора
interface Iterator<T> {
    boolean hasNext();
    T next();
}

// Интерфейс коллекции
interface IterableCollection<T> {
    Iterator<T> createIterator();
}

// Конкретный итератор
class StringIterator implements Iterator<String> {
    private List<String> collection;
    private int currentIndex = 0;

    public StringIterator(List<String> collection) {
        this.collection = collection;
    }

    @Override
    public boolean hasNext() {
        return currentIndex < collection.size();
    }

    @Override
    public String next() {
        return collection.get(currentIndex++);
    }
}

// Конкретная коллекция
class StringCollection implements IterableCollection<String> {
    private List<String> items = new ArrayList<>();

    public void add(String item) {
        items.add(item);
    }

    @Override
    public Iterator<String> createIterator() {
        return new StringIterator(items);
    }
}

// Пример использования
public class IteratorPatternExample {
    public static void main(String[] args) {
        StringCollection collection = new StringCollection();
        collection.add("Первый");
        collection.add("Второй");
        collection.add("Третий");

        Iterator<String> iterator = collection.createIterator();

        while (iterator.hasNext()) {
            String item = iterator.next();
            System.out.println(item);
        }
    }
}

Объяснение кода:

  1. Интерфейс Iterator определяет методы hasNext и next, которые позволяют проверять наличие следующего элемента и получать его.
  2. Интерфейс IterableCollection определяет метод createIterator, который возвращает итератор для коллекции.
  3. Класс StringIterator реализует интерфейс Iterator и управляет текущей позицией в коллекции строк. Он хранит ссылку на коллекцию и предоставляет методы для перебора элементов.
  4. Класс StringCollection реализует интерфейс IterableCollection и содержит список строк. Он предоставляет метод для добавления элементов и создает итератор.
  5. В методе main мы создаем коллекцию строк, добавляем в нее элементы и используем итератор для их перебора.

Таким образом, паттерн "Итератор" позволяет удобно перебирать элементы коллекции, не раскрывая ее внутреннюю структуру. Это делает код более гибким и упрощает работу с различными типами коллекций.