Статьи

Руководство по образцу итератора с примерами Java

Сегодняшний шаблон — это шаблон Iterator, который формализует то, как мы перемещаемся по коллекции данных в определенном классе.

Итератор в реальном мире 

Управление MP3-плеером является хорошим примером итератора. Пользователь не возражает против того, как просмотреть свой список песен, как только он их увидит. В старых mp3-плеерах это делалось с помощью простых кнопок вперед и назад. С iPod это изменилось на концепцию колесной навигации. IPhone перемещает это дальше, чтобы использовать движения смахивания. Тем не менее, все интерфейсы поддерживают одну и ту же идею — способ перебора вашей музыкальной коллекции.

Refcard Designs Patterns
Для лучшего обзора самых популярных шаблонов дизайна, лучше всего начать с Refcard Designs Patterns от DZone

Шаблон итератора

Паттерн Итератор известен как поведенческий паттерн, так как он используется для управления алгоритмами, отношениями и обязанностями между объектами. Определение Итератора, представленное в оригинальной книге «Бригада четырех» о DesignPatterns, гласит: 

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

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

Совокупный определяет интерфейс для создания объекта итератора. В ConcreteAggregate реализует этот интерфейс, и возвращает экземпляр ConcreteIterator. Итератора определяет интерфейс для доступа и обхода элементов, а ConcreteIterator реализует этот интерфейс , сохраняя при текущей позиции в обход агрегата.

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

Буду ли я использовать этот шаблон?

Этот шаблон полезен, когда вам нужен доступ к элементам набора без доступа ко всему представлению. Когда вам нужен унифицированный интерфейс обхода, и несколько элементов могут проходить через элементы, итератор — хороший выбор. 

Это также делает ваш код более разумным, избавляя от типичного синтаксиса for loop для всех разделов вашей кодовой базы.

Так как это работает в Java?

Java обеспечивает реализацию шаблона Iterator , который предоставляет методы next () и hasNext (). Создание итератора в Java обычно выполняется с помощью метода с именем iterator () в классе контейнера.
В следующем примере показано использование итератора со списком: 

List<String> list = new ArrayList<String>();//add strings Iterator it = list.iterator();while(it.hasNext()){   String s = it.next();}

Теперь давайте перейдем к примеру, где мы сами создаем конструкции, с примером удаленного управления.
Сначала мы создадим итератор со стандартными методами:

//Iterator interface public interface ChannelIterator{public boolean hasNext();public void next();public String currentItem();}

Затем мы создаем интерфейс Aggregate, в данном случае телевизор. 

//Aggregate interfacepublic interface TV{public Channel getIterator();//other TV methods}

Конкретная реализация агрегатора имеет возможность создавать итератор

//Concrete Aggregatorpublic class ConcreteTV{private ChannelIterator iterator; private List<String> channels; public ConcreteTV(){iterator = new ConcreteChannelIterator(channels);}public ChannelIterator getIterator(){return iterator;}}

Наконец, итератор помогает контролировать то, как мы перемещаемся по данным. 

//Concrete Iterator //Iterator interface public interface ChannelIterator{private List<String> channels; private int currentPos = 0; public ChannelIterator(List<String> channels){this.channels = channels;}public boolean hasNext(){if(currentPos + 1 < channels.size()){return true;}return false;}public void next(){currentPos++;}public String currentItem(){return channels.get(currentPos);}}

Конечно, это односторонний пульт дистанционного управления. Мы могли бы реализовать методы back () и hasBack () для обратной навигации в нашем итераторе. 

Остерегайтесь недостатков

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

Следующий

У нас осталось только два паттерна, поэтому предпоследним паттерном в нашей серии будет паттерн State.

Наслаждайтесь всей серией «Design Patterns Uncovered»:

Образцы творчества

Структурные паттерны

Поведенческие образцы