Ітератор
Ітератор (англ. Iterator) — шаблон проектування, належить до класу шаблонів поведінки.
Зміст |
Призначення [ред.]
Надає спосіб послідовного доступу до всіх елементів складеного об'єкта, не розкриваючи його внутрішнього улаштування.
Мотивація [ред.]
Складений об'єкт, скажімо список, повинен надавати спосіб доступу до своїх елементів, не розкриваючи їхню внутрішню структуру. Більш того, іноді треба обходити список по-різному, у залежності від задачі, що вирішується. При цьому немає ніякого бажання засмічувати інтерфейс класу Список усілякими операціями для усіх потрібних варіантів обходу, навіть якщо їх усі можна передбачити заздалегідь. Крім того, іноді треба, щоб в один момент часу існувало декілька активних операцій обходу списку.
Все це призводить до необхідності реалізації шаблону Ітератор. Його основна ідея у тому, щоб за доступ до елементів та обхід списку відповідав не сам список, а окремий об'єкт-ітератор. У класі Ітератор означений інтерфейс для доступу до елементів списку. Об'єкт цього класу прослідковує поточний елемент, тобто він володіє інформацією, які з елементів вже відвідувались.
Застосовність [ред.]
Можна використовувати шаблон Ітератор у випадках:
- для доступу до змісту агрегованих об'єктів не розкриваючи їхнє внутрішнє улаштування;
- для підтримки декількох активних обходів одного й того ж агрегованого об'єкта;
- для подання уніфікованого інтерфейсу з метою обходу різноманітних агрегованих структур (тобто для підтримки поліморфної ітерації).
Структура [ред.]
- Iterator
- визначає інтерфейс для доступу та обходу елементів
- ConcreteIterator
- реалізує інтерфейс класу Iterator;
- слідкує за поточною позицією під час обходу агрегату;
- Aggregate
- визначає інтерфейс для створення об'єкта-ітератора;
- ConcreteAggregate
- реалізує інтерфейс створення ітератора та повертає екземпляр відповідного класу ConcreteIterator
Відносини [ред.]
ConcreteIterator відслідковує поточний об'єкт у агрегаті та може вирахувати наступний.
Використання [ред.]
C# [ред.]
В мові програмування C# шаблон ітератор є вбудованим, його використання можливе за допомогою оператору foreach, за умови, що відповідний контейнер реалізує інтерфейс IEnumerable.
Наприклад:
string[] strings = new string[] { "one", "two", "three" }; foreach (string str in strings) { Console.WriteLine(str); }
Таку форму запису можна замінити на більш низько-рівневу, але еквівалентну:
string[] strings = new string[] { "one", "two", "three" }; IEnumerator enumerator = strings.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine((string)enumerator.Current); }
Джерела [ред.]
Література [ред.]
Алан Шаллоуей, Джеймс Р. Тротт Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М.: «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5
|
||||||||||||||
