Как видите, изменить классы узлов всё-таки придётся. Но это простое изменение в любое время позволит применять к объектам узлов и другие поведения. Ведь классы узлов будут привязаны не к конкретному классу посетителей, а к их общему интерфейсу. Поэтому если придётся добавить в программу новое поведение, вы создадите новый класс посетителей, реализующий общий интерфейс, и будете передавать его в методы узлов.

У страхового агента приготовлены полисы для разных видов организаций.
Представьте начинающего страхового агента, жаждущего получить новых клиентов. Он беспорядочно посещает все дома в округе, предлагая свои услуги. Но для каждого из «типов» домов, которые он посещает, у него имеется особое предложение.
Посетитель описывает общий интерфейс для всех типов посетителей. Он объявляет набор методов, которые принимают различные классы компонентов в качестве параметров. В языках, поддерживающих перегрузку методов, эти методы могут иметь одинаковые имена, но типы их параметров должны отличаться.
Конкретные посетители реализуют какое-то особенное поведение для всех типов компонентов, которые можно подать через методы интерфейс посетителя.
Компонент описывает метод принятия посетителя. Этот метод должен иметь единственный параметр, объявленный с типом интерфейса посетителя.
Конкретные компоненты реализуют методы принятия посетителя. Цель этого метода — вызвать тот метод посещения, который соответствует типу этого компонента. Так посетитель узнает, с каким именно компонентом он работает.
Клиентом зачастую выступает коллекция или сложный составной объект (например, дерево ). Клиент не знает конкретные классы своих компонентов.
В этом примере Посетитель добавляет в существующую иерархию классов геометрических фигур возможность экспорта в XML.

Пример организации экспорта объектов в XML через отдельный класс-посетитель.
Вам не кажется, что вызов метода accept – это лишнее звено здесь? Если так, то ещё раз рекомендую вам ознакомиться с проблемой раннего и позднего связывания в статье .
Когда вам нужно выполнить операцию над всеми элементами сложной структуры объектов (например, деревом).
Посетитель позволяет применять одну и ту же операцию к объектам различных классов.
Когда над объектами сложной структуры объектов надо выполнять некоторые, не связанные между собой операций, но вы не хотите «засорять» классы такими операциями.
Посетитель позволяет извлечь родственные операции из классов, составляющих структуру объектов, поместив их в один класс-посетитель. Если структура объектов является общей для нескольких приложений, то паттерн позволит в каждое приложение включить только нужные операции.
Когда новое поведение имеет смысл только для некоторых классов из существующей иерархии.
Посетитель позволяет определить поведение только для этих классов и оставить его пустым для всех остальных.
Создайте интерфейс посетителя и объявите в нём методы «посещения» для каждого класса компонента, который существует в программе.
Опишите интерфейс компонентов. Если вы работаете с уже существующими классами, то объявите абстрактный метод принятия посетителей в базовом классе иерархии компонентов.
Реализуйте методы принятия во всех конкретных компонентах. Они должны переадресовывать вызовы тому методу посетителя, в котором класс параметра совпадает с текущим классом компонента.
Иерархия компонентов должна знать только о базовом интерфейсе посетителей. С другой стороны, посетители будут знать обо всех классах компонентов.
Для каждого нового поведения создайте свой конкретный класс. Приспособьте это поведение для всех посещаемых компонентов, реализовав все методы интерфейса посетителей.
Вы можете столкнуться с ситуацией, когда посетителю нужен будет доступ к приватным полям компонентов. В этом случае, вы можете либо раскрыть доступ к этим полям, нарушив инкапсуляцию компонентов, либо сделать класс посетителя вложенным в класс компонента, если вам повезло писать на языке, который поддерживает вложенность классов.
Клиент будет создавать объекты посетителей, а затем передавать их компонентам, используя метод принятия.
можно рассматривать как расширенный аналог , который способен работать сразу с несколькими видами получателей.
Вы можете выполнить какое-то действие над всем деревом при помощи .
можно использовать совместно с . Итератор будет отвечать за обход структуры данных, а Посетитель — за выполнение действий над каждым её компонентом.