Відвідувач (шаблон проектування)
Відвідувач (Visitor) — шаблон проектування, який дозволяє відділити певний алгоритм від елементів, на яких алгоритм має бути виконаний, таким чином можливо легко додати або ж змінити алгоритм без змін щодо елементів системи. Практичним результатом є можливість додавання нових операцій в існуючі структури об'єкта без зміни цих структур.
Відвідувач дозволяє додавати нові віртуальні функції в родинні класи без зміни самих класів, натомість, один відвідувач створює клас, який реалізує всі відповідні спеціалізації віртуальної функції. Відвідувач бере приклад посилання в якості вхідних даних і реалізується шляхом подвійної диспетчеризації.
Зміст |
Призначення шаблону [ред.]
- Шаблон Відвідувач визначає операцію, виконувану над кожним елементом деякої структури. Дозволяє, не змінюючи класи цих об'єктів, додавати в них нові операції.
- Є класичною технікою для відновлення втраченої інформації про тип.
- Шаблон Відвідувач дозволяє виконати потрібні дії в залежності від типів двох об'єктів.
Проблема [ред.]
Над кожним об'єктом деякої структури виконується одна або більше операцій. Визначити нову операцію, не змінюючи класи об'єктів.
Опис шаблону [ред.]
Основним призначенням патерну Відвідувач є введення абстрактної функціональності для сукупної ієрархічної структури об'єктів «елемент», а саме, патерн відвідувач дозволяє, не змінюючи класи елементів, додавати в них нові операції. Для цього вся обробна функціональність переноситься з самих класів елементів в ієрархію спадкування Відвідувача.
Шаблон відвідувач дозволяє легко додавати нові операції — потрібно просто додати новий похідний від відвідувача клас. Однак патерн Відвідувач слід використовувати тільки в тому випадку, якщо підкласи елементів сукупної ієрархічної структури залишаються стабільними (незмінними). В іншому випадку, потрібно докласти значних зусиль на оновлення всієї ієрархії.
Іноді наводяться заперечення з приводу використання патерну Відвідувач, оскільки він розділяє дані та алгоритми, що суперечить концепції об'єктно-орієнтованого програмування . Однак успішний досвід застосування STL, де поділ даних і алгоритмів покладено в основу, доводить можливість використання патерну відвідувач.
Особливості шаблону [ред.]
- Сукупна структура об'єктів елементу може визначатися за допомогою патерну Компонувальник (Composite).
- Для обходу може використовуватися Ітератор (Iterator).
- Шаблон Відвідувач демонструє класичний прийом відновлення інформації про втрачені типи, не вдаючись до понижуючого приведення типів(динамічне приведення).
Посилання [ред.]
- Visitor Design Pattern
- Visitor pattern in UML and in LePUS3 (a Design Description Language)]
- Visitor Pattern using reflection(java)
- Design Patterns: Elements of Reusable Object-Oriented Software
|
||||||||||||||