Привет всем, в этом посте мы будем проверять шаблон итератора . Шаблон дизайна, который, как я знаю, многие из вас уже использовали, но, возможно, вы не понимали, что это шаблон, или не знали его большой ценности. Согласно книге Head First Design :
Шаблон Iterator предоставляет способ последовательного доступа к элементам агрегатного объекта, не раскрывая его базовое представление.
Whaaaaat? Что ж, это говорит о том, что независимо от того, какую структуру данных (массивы, списки, хеш-таблицы и т. Д.) Вы используете, вы всегда можете обойти ее одинаково, если реализуете этот шаблон. Это дает вам единый способ доступа к элементам ваших структур данных (агрегатов), но вам не нужно знать, что это за структура данных.
Вы пересекаете … приятно! Кроме того, он устанавливает ответственность за итерацию для объекта Iterator, а не для вашей структуры данных, что упрощает кодирование в вашей структуре данных. Давайте проверим классическую диаграмму классов для шаблона Iterator:
Фактическая диаграмма классов для шаблона Iterator имеет несколько изменений, особенно в классе (интерфейсе) Iterator, где у нас теперь есть разные методы, как мы увидим через минуту, но сначала давайте рассмотрим каждый из предыдущих классов (или интерфейсов). ):
- Агрегат : это базовый класс (или интерфейс) наших структур данных, вы можете рассматривать его как интерфейс java.util.Collection , который определяет множество методов для классов коллекции.
- ConcreteAggregate : это конкретная структура данных, которую мы будем повторять, например, java.util.ArrayList , java.util.Vector и т. Д.
- Итератор : Базовый класс (или интерфейс) для итераторов. Вы можете найти его в Java на java.util.Iterator . Вы можете заметить, что версия Java имеет разные методы, которые мы обсудим позже в этом посте. Здесь вы определяете методы de, необходимые для обхода структур данных.
- ConcreteIterator : поскольку вы хотите обойти разные структуры данных, вам нужны разные итераторы. Таким образом, concreteIterator — это итератор для структуры данных, которую вы хотите пересечь.
Теперь давайте посмотрим на реализацию Java шаблона итератора. Следующая диаграмма была сгенерирована с использованием бесплатного инструмента Architexa для понимания кода, и она показывает отношения между некоторыми классами Java Collections Framework, где мы можем увидеть структуру, похожую на классическую диаграмму классов:
Приведенная выше диаграмма показывает только одну реализацию шаблона в Java, их намного больше, но они всегда используют интерфейс java.util.Iterator ; это интерфейс, который вы должны использовать в своих реализациях шаблона итератора при кодировании на Java. Давайте сравним обе диаграммы:
Вы не можете увидеть этот класс в JavaDocs, но он есть в исходном коде: java.util.Itr
Обратите внимание, что методы объекта Iterator в примере Java отличаются от методов классической диаграммы классов:
- Нет метода + First (). Если вам нужно перейти к первому элементу, вы должны создать новый итератор.
- Метод + IsDone () был переименован в + hasNext ().
- + Next () и + CurrentItem () были объединены с + next ().
- Метод + remove () был добавлен.
Итак, если вам когда-либо приходится работать с различными структурами данных и вам нужен единый способ их обхода и / или доступа к их элементам, подумайте о шаблоне итератора:
01
02
03
04
05
06
07
08
09
10
11
12
|
//... in a class /** * Traverse a list, hashtable, vector, etc. what ever that implements * the Iterator Pattern */ public void traverse(Iterator iter) { while (iter.hasNext()) { System.out.println(iter.next()); } } |
Конечно, вам всегда нужно будет создавать класс ConcreteIterator для вашей структуры данных, но если вы используете классы из
Java Collections Framework , это уже сделано.
И последнее, помните самый важный принцип ОО из всех: всегда используйте самое простое решение, которое соответствует вашим потребностям, даже если оно не содержит шаблон .
Ресурсы:
Фриман Эрик и Фриман Элизабет и Сьерра Кэти и Бейтс Берт (2004). Голова Первые шаблоны дизайна . Соединенные Штаты Америки: O’Reilly Media, Inc.
Ссылка: образец итератора и Java от нашего партнера JCG Алексиса Лопеса в блоге Java и ME .