Итератор (шаблон проектирования)

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Шаблон проектирования
Итератор
Iterator
Тип:

поведенческий

Описан в Design Patterns

Да

Iterator (англ. Cursor) — поведенческий шаблон проектирования, относится к паттернам поведения. Представляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого из объектов, входящий в состав агрегации.

Например, такие элементы как дерево, связанный список, хэш-таблица и массив могут быть пролистаны (и модифицированы) с помощью паттерна (объекта) Итератор.

Перебор элементов выполняется объектом итератора, а не самой коллекцией. Это упрощает интерфейс и реализацию коллекции, а также способствует более логичному распределению обязанностей.

Особенностью полноценно реализованного итератора является то, что код, использующий итератор, может ничего не знать о типе итерируемого агрегата.

Конечно же, почти любой агрегат можно итерировать указателем void*, но при этом:

  • не ясно, что является значением «конец агрегата», для двусвязного списка это &ListHead, для массива это &array[size], для односвязного списка это NULL
  • операция Next сильно зависит от типа агрегата.

Итераторы абстрагируют именно эти 2 проблемы, используя полиморфный Next (часто реализованный как operator++ в С++) и полиморфный aggregate.end(), возвращающий значение «конец агрегата».

Таким образом, появляется возможность работы с диапазонами итераторов, при отсутствии знания о типе итерируемого агрегата. Например:

Iterator itBegin = aggregate.begin();
Iterator itEnd = aggregate.end();
func(itBegin, itEnd);

И далее:

void func(Iterator itBegin, Iterator itEnd)
{
 for( Iterator it = itBegin, it != itEnd; ++it )
 {
 }
}

Пример на С#[править | править вики-текст]


Пример на PHP5[править | править вики-текст]


Пример итератора компоновщика на PHP5[править | править вики-текст]

Использование[править | править вики-текст]

  • интерфейсы IEnumXXX в COM. Для Next используется динамический полиморфизм.
  • STL. Итераторы являются шаблонами, и для Next (точнее, operator++) используется статический полиморфизм через разворачивание шаблона. Все алгоритмы STL, работающие над множествами, работают с диапазонами итераторов, и свободны от знания о конкретном типе агрегата.


См. также[править | править вики-текст]