Шаблон Посетитель позволяет записывать операции над объектами без расширения класса объекта. Конечно. Но почему бы просто не написать глобальную функцию или статический класс, который манипулирует моей коллекцией объектов извне? По сути, в таком языке, как java, метод accept()
необходим по техническим причинам; но на языке, где я могу реализовать тот же дизайн без метода accept()
, становится ли шаблон посетителя тривиальным?
Объяснение: В шаблоне Посетитель доступные для посещения классы (сущности) имеют метод .accept()
, задачей которого является вызов метода .visit()
посетителя для самих себя. Я вижу логику примеров Java: посетитель определяет разные .visit(n)
методы для каждого доступного для посещения типа n
, который он поддерживает, и для выбора среди них во время выполнения необходимо использовать прием .accept()
. Но такие языки, как python или php, имеют динамическую типизацию и не перегружают методы. Если я посетитель, я могу вызвать метод сущности (например, .serialize()
), не зная ни типа сущности, ни даже полной подписи метода. (Это проблема «двойной отправки», верно?)
Я знаю, что метод accept может передать посетителю защищенные данные, но какой в этом смысл? Если данные доступны классам-посетителям, они фактически являются частью интерфейса класса, поскольку его детали имеют значение вне класса. Во всяком случае, раскрытие личных данных никогда не казалось мне целью шаблона поведения посетителей.
Итак, кажется, что в python, ruby или php я могу реализовать класс, подобный посетителю, без метода accept в посещаемом объекте (и без отражения), верно? Если я могу работать с семейством разнородных объектов и вызывать их общедоступные методы без какого-либо сотрудничества с «посещенным» классом, заслуживает ли это того, чтобы называться «шаблоном посетителя»? Есть ли что-то в сути паттерна, чего мне не хватает, или он просто сводится к тому, чтобы «написать новый класс, который манипулирует вашими объектами извне для выполнения операции»?
PS. Я просмотрел множество дискуссий по SO и в других местах, но не смог найти ничего, что касалось бы этого вопроса. Указатели приветствуются.