Полезен ли шаблон Посетитель для языков с динамической типизацией?

Шаблон Visitor позволяет писать операции над объектами без расширения класса объекта. Конечно. Но почему бы просто не написать глобальную функцию или статический класс, который манипулирует моей коллекцией объектов извне? По сути, в таком языке, как java, метод accept() необходим по техническим причинам; но в языке, где я могу реализовать тот же дизайн без метода accept () , шаблон «Посетитель» становится тривиальным?

Объяснение: В шаблоне Посетитель доступные для посещения классы (сущности) имеют метод .accept(), задачей которого является вызов метода посетителя .visit()для самих себя. Я вижу логику java-примеров: посетитель определяет разные методы .visit(n)для каждого доступного для посещения типа n, который он поддерживает, и .accept() Чтобы выбрать один из них во время выполнения, необходимо использовать трюк. Но такие языки, как python или php, имеют динамическую типизацию и не перегружают методы. Если я посетитель, я могу вызвать метод сущности (например, .serialize()), не зная типа сущности или даже полной подписи метода.(Это проблема "двойной отправки", верно?)

Я знаю, что метод accept может передавать посетителю защищенные данные, но какой в ​​этом смысл? Если данные доступны классам-посетителям, они фактически являются частью интерфейса класса, поскольку его детали имеют значение вне класса. Во всяком случае, раскрытие личных данных никогда не казалось мне целью шаблона поведения посетителей.

Получается, что в python, ruby ​​или php я могу реализовать класс, подобный посетителю, без метода accept в посещаемом объекте (и без отражения), верно? Если я могу работать с семейством разнородных объектов и вызывать их общедоступные методы без какого-либо сотрудничества с «посещенным» классом, заслуживает ли это того, чтобы называться «шаблоном посетителя»? Есть ли что-то в сути паттерна, чего мне не хватает, или он просто сводится к тому, чтобы «написать новый класс, который манипулирует вашими объектами извне для выполнения операции»?

ПС. Я просмотрел множество дискуссий по SO и в других местах, но не смог найти ничего, что касалось бы этоговопроса. Указатели приветствуются.

8
задан Marcin 17 April 2015 в 14:42
поделиться