В чем суть паттерна «посетитель»?



@user_of_toster

1) Вынос некоторой функции дерева подклассов в отдельный класс — когда нельзя реализовать метод непосредственно в дереве подклассов, метод выносится в отдельный класс.

2) Двойная диспетчеризация — элемент сам вызывает нужный метод в посетителе. (Замена условных операторов ̶п̶о̶л̶и̶м̶о̶р̶ф̶и̶з̶м̶о̶м̶ вызовом нужного метода)
Говорят, что двойная диспетчеризация не является основной идеей.

Так в чем суть — мы просто выносим функцию из дерева подклассов в отдельный класс? В этом суть паттерна? Или суть все-таки в замене условных операторов вызовом метода в посетителе?

Не нарушаем ли мы OCP?


Решения вопроса 4



@koperagen

Суть его в том, что позволяет быть уверенным, что ты обработал все возможные подтипы какого-то типа. Ну, скажем, если есть `class Node`, `class Leaf1 : Node`, `class Leaf2 : Node`, то клиентский код мог бы быть написан вот так

if (node instanceof Node) {
...
} else of (node instanceof Leaf1) {
...
}

В общем случае компилятор не станет ругаться, если пропустить проверку на instanceof Leaf2. Если задача подразумевает обязательность обработки всех существующих подтипов, то за этим придется следить самому. Не очень то хочется, учитывая, что в иерархии классов синтаксического дерева какого-нибудь языка может быть и 40 наследников.

По другому цель посетителя можно сформулировать как «более строгий контракт между модулем (что угодно, определяющее посетителя) и клиентом (что угодно, его реализующее)». Модуль настаивает, чтобы ты умел обрабатывать именно каждый подтип как-то по своему и дает удобный для этого инструмент.

Комментировать

Ответы на вопрос 0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *