Page 32 - 4252
P. 32

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


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



























                                                           31
   27   28   29   30   31   32   33   34   35   36   37