Назначение: описывает операцию, выполняемую с каждым объектом из некоторой структуры, при этом определение новой операции не изменяет классы этих объектов.
Общая структура решения.
Visitor – посетитель: объявляет операцию Visit для каждого класса ConcreteElement в структуре объектов. Сигнатура этой операции идентифицирует класс, который посылает посетителю запрос Visit. Это позволяет посетителю определить, элемент какого конкретного класса он посещает. Владея такой информацией, посетитель может обращаться к элементу напрямую через его интерфейс.
ConcreteVisitor – конкретные посетители: реализуют все операции, объявленные в классе Visitor. Каждая операция реализует фрагмент алгоритма, определенного для класса соответствующего объекта в структуре. Класс ConcreteVisitor предоставляет контекст для этого алгоритма и сохраняет его локальное состояние. Часто в этом состоянии аккумулируются результаты, полученные в процессе обхода структуры.
Element – элемент: определяет операцию Accept, которая принимает посетителя в качестве аргумента.
ConcreteElement – конкретные элементы: реализуют операцию Accept, принимающую посетителя как аргумент.
ObjectStructure – структура объектов: может перечислить свои элементы и предоставить посетителю высокоуровневый интерфейс для посещения своих элементов. Может быть как составным объектом (паттерн Компоновщик), так и коллекцией, например списком или множеством.
Клиент, использующий паттерн Посетитель, должен создать объект класса ConcreteVisitor, а затем обойти всю структуру, посетив каждый ее элемент. При посещении конкретного элемента этот элемент вызывает операцию посетителя, соответствующую своему классу. Элемент передает этой операции себя в качестве аргумента, чтобы посетитель мог при необходимости получить доступ к его состоянию.