-
Notifications
You must be signed in to change notification settings - Fork 3
Visitor
Pandas edited this page Jun 20, 2017
·
1 revision
Описывает операцию, выполняемую с каждым объектом из некоторой структуры. Паттерн посетитель позволяет определить новую операцию, не изменяя классы этих объектов.
Используйте паттерн посетитель, когда:
- В структуре присутствуют объекты многих классов с различными интерфейсами и вы хотите выполнять над ними операции, зависящие от конкретных классов;
- Над объектами, входящими в состав структуры, надо выполнять разнообразные, не связанные между собой операции и вы не хотите «засорять» классы такими операциями.
- Классы, устанавливающие структуру объектов, изменяются редко, но новые операции над этой структурой добавляются часто. При изменении классов, представленных в структуре, нужно будет переопределить интерфейсы всех посетителей, а это может вызвать затруднения. Поэтому если классы меняются достаточно часто, то, вероятно, лучше определить операции прямо в них.
- Visitor - посетитель: объявляет операцию V i s i t для каждого класса ConcreteElement в структуре объектов. Имя и сигнатура этой операции идентифицируют класс, который посылает посетителю запрос Visit. Это позволяет посетителю определить, элемент какого конкретного класса он посещает. Владея такой информацией, посетитель может обращаться к элементу напрямую через его интерфейс;
- Concrete Visitor - конкретный посетитель: реализует все операции, объявленные в классе Visitor. Каждая операция реализует фрагмент алгоритма, определенного для класса соответствующего объекта в структуре. Класс ConcreteVisitor предоставляет контекст для этого алгоритма и сохраняет его локальное состояние. Часто в этом состоянии аккумулируются результаты, полученные в процессе обхода структуры;
- Element (Node) - элемент: определяет операцию Accept, которая принимает посетителя в качестве аргумента;
- ConcreteElement (AssignmentNode, VariableRefNode) – конкретный элемент: реализует операцию Accept, принимающую посетителя как аргумент;
- ObjectStructure (Program) - структура объектов: может перечислить свои элементы; может предоставить посетителю высокоуровневый интерфейс для посещения своих элементов; - может быть, как составным объектом (см. паттерн компоновщик), так и коллекцией, например списком или множеством.
- Некоторые достоинства и недостатки паттерна посетитель:
- Упрощает добавление новых операций.
- Объединяет родственные операции и отсекает те, которые не имеют к ним отношения.
- Добавление новых классов ConcreteElement затруднено.
- Посещение различных иерархий классов. Итератор может посещать объекты структуры по мере ее обхода, вызывая операции объектов.
- Аккумулирование состояния
- Нарушение инкапсуляции
