Сегодняшний шаблон — это шаблон 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»:
Образцы творчества
- Узнайте абстрактный шаблон фабрики
- Изучите Образец Строителя
- Изучите шаблон метода фабрики
- Изучите образец прототипа
- Изучите образец Синглтона
Структурные паттерны
- Узнайте шаблон адаптера
- Изучите Образец Моста
- Изучите составной шаблон
- Изучите Образец Декоратора
- Изучите Образ Фасада
- Выучите образец веса
- Изучите Образец Прокси
Поведенческие образцы
- Изучите Образец Цепочки Ответственности
- Изучите шаблон команд
- Изучите образец интерпретатора
- Изучите образец итератора
- Изучите Образец Посредника
- Выучите Образец Памяти
- Изучите Образец Наблюдателя
- Изучите Государственный Образец
- Узнайте шаблон стратегии
- Изучите шаблон метода шаблона
- Изучите образец посетителя