Відвідувач (шаблон проектування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Відвідувач (Visitor) — шаблон проектування, який дозволяє відділити певний алгоритм від елементів, на яких алгоритм має бути виконаний, таким чином можливо легко додати або ж змінити алгоритм без змін щодо елементів системи. Практичним результатом є можливість додавання нових операцій в існуючі структури об'єкта без зміни цих структур.

Відвідувач дозволяє додавати нові віртуальні функції в родинні класи без зміни самих класів, натомість, один відвідувач створює клас, який реалізує всі відповідні спеціалізації віртуальної функції. Відвідувач бере приклад посилання в якості вхідних даних і реалізується шляхом подвійної диспетчеризації.

Зміст

Призначення шаблону [ред.]

  • Шаблон Відвідувач визначає операцію, виконувану над кожним елементом деякої структури. Дозволяє, не змінюючи класи цих об'єктів, додавати в них нові операції.
  • Є класичною технікою для відновлення втраченої інформації про тип.
  • Шаблон Відвідувач дозволяє виконати потрібні дії в залежності від типів двох об'єктів.

Проблема [ред.]

Над кожним об'єктом деякої структури виконується одна або більше операцій. Визначити нову операцію, не змінюючи класи об'єктів.

Опис шаблону [ред.]

Основним призначенням патерну Відвідувач є введення абстрактної функціональності для сукупної ієрархічної структури об'єктів «елемент», а саме, патерн відвідувач дозволяє, не змінюючи класи елементів, додавати в них нові операції. Для цього вся обробна функціональність переноситься з самих класів елементів в ієрархію спадкування Відвідувача.

Шаблон відвідувач дозволяє легко додавати нові операції — потрібно просто додати новий похідний від відвідувача клас. Однак патерн Відвідувач слід використовувати тільки в тому випадку, якщо підкласи елементів сукупної ієрархічної структури залишаються стабільними (незмінними). В іншому випадку, потрібно докласти значних зусиль на оновлення всієї ієрархії.

Іноді наводяться заперечення з приводу використання патерну Відвідувач, оскільки він розділяє дані та алгоритми, що суперечить концепції об'єктно-орієнтованого програмування . Однак успішний досвід застосування STL, де поділ даних і алгоритмів покладено в основу, доводить можливість використання патерну відвідувач.

Особливості шаблону [ред.]

  • Сукупна структура об'єктів елементу може визначатися за допомогою патерну Компонувальник (Composite).
  • Для обходу може використовуватися Ітератор (Iterator).
  • Шаблон Відвідувач демонструє класичний прийом відновлення інформації про втрачені типи, не вдаючись до понижуючого приведення типів(динамічне приведення).

Посилання [ред.]