EMZETT.
Войти

Паттерн «Посетитель» (Visitor)

Коротко: Паттерн Visitor отделяет операцию от структуры объектов, с которой она работает, так что новые операции можно добавлять, не меняя классы.

Подробнее: Каждый элемент предлагает метод accept(visitor) и внутри вызывает visitor.visit(this). Посетитель содержит соответствующий код для каждого типа элемента («double dispatch»).

Подробности

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

См. также: Паттерн «Итератор»