Я всегда думал, что объекту нужны данные и сообщения, чтобы воздействовать на него.Когда вы хотите метод, который является внешним по отношению к объекту?Какое правило вы придерживаетесь, чтобы иметь посетителя?Это предполагает, что у вас есть полный контроль над графом объектов.
Иногда бывает не удобно иметь все поведения для определенного объекта, определенного в одном классе.Например, в Java, если ваш модуль требует, чтобы метод toXml
был реализован в группе классов, первоначально определенных в другом модуле, это сложно, потому что вы не можете написать toXml
где-то еще, чем исходный файл класса, что означает, что вы можетене расширять систему без изменения существующих источников (в Smalltalk или других языках вы можете группировать методы по расширению, которые не привязаны к определенному файлу).
В более общем случае в статически типизированных языках существует противоречие между способностью (1) добавлять новые функции к существующим типам данных и (2) добавлять новые реализации типов данных, поддерживающие те же функции - это называется проблема выражения ( страница википедии ).
Объектно-ориентированные языки превосходят в точке 2. Если у вас есть интерфейс, вы можете безопасно и легко добавлять новые реализации.Функциональные языки превосходят в точке 1. Они основаны на сопоставлении с образцом / специальном полиморфизме / перегрузке, поэтому вы можете легко добавлять новые функции к существующим типам.
Шаблон посетителя - это способ поддержки точки 1 в объекте.ориентированный дизайн: вы можете легко расширить систему с новым поведением безопасным для типов способом (что было бы не так, если бы вы выполняли ручное сопоставление с шаблоном if-else-instanceof
, потому что язык никогда не предупреждаетВы, если дело не покрыто).
Посетителей тогда обычно используют, когда существует фиксированный набор известных типов, что, я думаю, и имеет в виду «полный контроль над графом объектов».Примеры включают токен в парсере, дерево с различными типами узлов и подобные ситуации.
Итак, в заключение я бы сказал, что вы были правы в своем анализе :)
PS: шаблон посетителей хорошо работает с составным шаблоном, но они также полезны по отдельности