Skip to content

Visitor

Pandas edited this page Jun 20, 2017 · 1 revision

Назначение

Описывает операцию, выполняемую с каждым объектом из некоторой структуры. Паттерн посетитель позволяет определить новую операцию, не изменяя классы этих объектов.

Применимость

Используйте паттерн посетитель, когда:

  • В структуре присутствуют объекты многих классов с различными интерфейсами и вы хотите выполнять над ними операции, зависящие от конкретных классов;
  • Над объектами, входящими в состав структуры, надо выполнять разнообразные, не связанные между собой операции и вы не хотите «засорять» классы такими операциями.
  • Классы, устанавливающие структуру объектов, изменяются редко, но новые операции над этой структурой добавляются часто. При изменении классов, представленных в структуре, нужно будет переопределить интерфейсы всех посетителей, а это может вызвать затруднения. Поэтому если классы меняются достаточно часто, то, вероятно, лучше определить операции прямо в них.

Структура

Imgur

Участники

  • Visitor - посетитель: объявляет операцию V i s i t для каждого класса ConcreteElement в структуре объектов. Имя и сигнатура этой операции идентифицируют класс, который посылает посетителю запрос Visit. Это позволяет посетителю определить, элемент какого конкретного класса он посещает. Владея такой информацией, посетитель может обращаться к элементу напрямую через его интерфейс;
  • Concrete Visitor - конкретный посетитель: реализует все операции, объявленные в классе Visitor. Каждая операция реализует фрагмент алгоритма, определенного для класса соответствующего объекта в структуре. Класс ConcreteVisitor предоставляет контекст для этого алгоритма и сохраняет его локальное состояние. Часто в этом состоянии аккумулируются результаты, полученные в процессе обхода структуры;
  • Element (Node) - элемент: определяет операцию Accept, которая принимает посетителя в качестве аргумента;
  • ConcreteElement (AssignmentNode, VariableRefNode) – конкретный элемент: реализует операцию Accept, принимающую посетителя как аргумент;
  • ObjectStructure (Program) - структура объектов: может перечислить свои элементы; может предоставить посетителю высокоуровневый интерфейс для посещения своих элементов; - может быть, как составным объектом (см. паттерн компоновщик), так и коллекцией, например списком или множеством.

Результаты

  • Некоторые достоинства и недостатки паттерна посетитель:
  • Упрощает добавление новых операций.
  • Объединяет родственные операции и отсекает те, которые не имеют к ним отношения.
  • Добавление новых классов ConcreteElement затруднено.
  • Посещение различных иерархий классов. Итератор может посещать объекты структуры по мере ее обхода, вызывая операции объектов.
  • Аккумулирование состояния
  • Нарушение инкапсуляции

Clone this wiki locally