Патерн «Відвідувач» (Visitor)
Коротко: Патерн Visitor відокремлює операцію від структури об’єктів, з якою вона працює, тож нові операції можна додавати, не змінюючи класи.
Докладніше: Кожен елемент пропонує метод accept(visitor) і всередині викликає visitor.visit(this). Відвідувач містить відповідний код для кожного типу елемента («double dispatch»).
Подробиці
- Типовий приклад: Синтаксичне дерево з вузлів на кшталт число, додавання, змінна. Відвідувачі — «обчислити», «вивести», «оптимізувати».
- Перевага: Нова операція = новий клас відвідувача, без правки класів вузлів.
- Недолік: Нові типи вузлів змушують змінювати всіх відвідувачів. Патерн окупається, коли операції змінюються частіше, ніж типи.
- Альтернативи: У мовах зі зіставленням із зразком за сумарними типами (Rust, Kotlin, TypeScript, сучасна Java)
matchчасто замінює відвідувача. - Відомий із: Компіляторів, обходів файлової системи,
ast.NodeVisitorу Python.
Див. також: Патерн «Ітератор»