EMZETT.
Увійти

Патерн «Відвідувач» (Visitor)

Коротко: Патерн Visitor відокремлює операцію від структури об’єктів, з якою вона працює, тож нові операції можна додавати, не змінюючи класи.

Докладніше: Кожен елемент пропонує метод accept(visitor) і всередині викликає visitor.visit(this). Відвідувач містить відповідний код для кожного типу елемента («double dispatch»).

Подробиці

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

Див. також: Патерн «Ітератор»