Хорошо, прежде чем отмечать это как дубликат, позвольте мне уточнить. Я читаю о шаблоне посетителя и его применимых целях.
Я наткнулся на этот пост: Когда следует использовать шаблон дизайна посетителя?
и пользователь, который написал первый ответ, говорит следующее:
Теперь мы хотим добавить новую операцию в иерархию, а именно хотим каждое животное, чтобы сделать свой звук. Поскольку иерархия эта простая, вы можете сделать это с прямым полиморфизмом:
...
Но продолжая в этом путь, каждый раз, когда вы хотите добавить операцию, вы должны изменить интерфейс к каждому классу иерархии.
Теперь я в основном вижу, почему это необходимо с его точки зрения, это в основном способ сократить время компиляции, сделав это не каждый раз, когда вы хотите добавить новый полиморфный метод в иерархию классов, вся иерархия будет перекомпилирована.
Но он также говорит, что это прекрасно добавляет новый полиморфный метод в иерархию, пока это "простая" иерархия. Но мой вопрос заключается в том, когда вы настраиваете свою линию и решаете, что просто, а что нет.
Кроме того, что, если иерархия является сложной, но добавление нового метода просто делает полный смысл и метод экземпляра вместо того, чтобы иметь операцию в совершенно другом классе?
Поиск немного больше Я нашел эту статью, объясняя шаблон посетителя, и он использует http://butunclebob.com/ArticleS.UncleBob.IuseVisitor
Автор привел пример, где запись метода экземпляра делает объект связанным с чем-то и перемещение метода в другой класс (посетитель) нарушает развязку. Это имело для меня больше смысла, но я все еще не совсем уверен, когда этот шаблон действительно должен использоваться, первый аргумент "изменение времени иерархии каждый раз, когда вы хотите добавить новый полиморфный метод..." мне кажется оправдание, потому что, если метод, похоже, вписывается в иерархию, он должен быть там логически, предположив, что пример Animal был действительно сложной иерархией, и я бы решил добавить метод make sound, добавив, что метод экземпляра будет логичным выбором (в моем ум).
Но, может быть, я ошибаюсь, поэтому я прошу об этом более подробно, может быть, кто-то может просветить меня.