Iterator (Итератор)
Шаблон проектирования "Итератор" (Iterator) предоставляет способ последовательного доступа к элементам коллекции без раскрытия ее внутренней структуры. Этот паттерн позволяет обойтись без необходимости знать, как устроена коллекция, и предоставляет единый интерфейс для перебора элементов.
Основные компоненты паттерна "Итератор":
- Итератор (Iterator): интерфейс, который определяет методы для доступа к элементам коллекции.
- Конкретный итератор (Concrete Iterator): класс, который реализует интерфейс итератора и управляет текущей позицией в коллекции.
- Коллекция (Aggregate): интерфейс, который определяет метод для создания итератора.
- Конкретная коллекция (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);
}
}
}
Объяснение кода:
- Интерфейс
Iterator
определяет методыhasNext
иnext
, которые позволяют проверять наличие следующего элемента и получать его. - Интерфейс
IterableCollection
определяет методcreateIterator
, который возвращает итератор для коллекции. - Класс
StringIterator
реализует интерфейсIterator
и управляет текущей позицией в коллекции строк. Он хранит ссылку на коллекцию и предоставляет методы для перебора элементов. - Класс
StringCollection
реализует интерфейсIterableCollection
и содержит список строк. Он предоставляет метод для добавления элементов и создает итератор. - В методе
main
мы создаем коллекцию строк, добавляем в нее элементы и используем итератор для их перебора.
Таким образом, паттерн "Итератор" позволяет удобно перебирать элементы коллекции, не раскрывая ее внутреннюю структуру. Это делает код более гибким и упрощает работу с различными типами коллекций.