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