Статьи

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

Привет всем, в этом посте мы будем проверять шаблон итератора . Шаблон дизайна, который, как я знаю, многие из вас уже использовали, но, возможно, вы не понимали, что это шаблон, или не знали его большой ценности. Согласно книге 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. Давайте сравним обе диаграммы:

Классическая Диаграмма
заполнитель
Итератор
ConcreteIterator

Обратите внимание, что методы объекта 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 .