Page 32 - 4252
P. 32
Проблема Над кожним об'єктом деякої структури виконується опера-
ція. Визначити нову операцію, не змінюючи класи об'єктів.
Рішення Клієнт, що використовує даний патерн, повинен створити
об'єкт класу "КонкретнийВідвідувач", а потім відвідати кожен
елемент структури. "Відвідувач", оголошує операцію "Відвіда-
ти" для кожного класу "КонкретнийЕлемент" (ім'я та сигнатура
даної операції ідентифікують клас, елемент якого відвідує "Від-
відувач" - тобто, відвідувач може звертатися до елемента пря-
мо). "КонкретнийВідвідувач" реалізує всі операції, оголошені в
класі "Відвідувач". Кожна операція реалізує фрагмент алгорит-
му, визначеного для класу відповідного об'єкта в структурі.
Клас "КонкретнийВідвідувач" надає контекст для цього ал-
горитму і зберігає його локальний стан. "Елемент" визначає
операцію "Прийняти", яка приймає "Відвідувача" як аргумент,
"КонкретнийЕлемент" реалізує операцію "Прийняти", яка при-
ймає "Відвідувача" як аргумент. "СтруктураОб’єкта" може пе-
рерахувати свої аргументи і надати відвідувачеві високорівне-
вий інтерфейс для відвідування своїх елементів.
Даний патерн логічно використовувати, якщо в структурі
присутні об'єкти багатьох класів з різними інтерфейсами, і не-
обхідно виконати над ними операції, що залежать від конкрет-
них класів, або якщо класи, встановлюють структуру об'єктів,
змінюються рідко, але нові операції над цією структурою дода-
ються часто.
Даний патерн спрощує додавання нових операцій, об'єднує
споріднені операції в класі "Відвідувач".
У даному патерні утруднено додавання нових класів "Конк-
ретнийЕлемент", оскільки потрібне оголошення нової абстракт-
ної операції в класі "Відвідувач".
31