Посетитель (шаблон проектирования)

Посетитель (шаблон проектирования)
Шаблон проектирования
Посетитель
Visitor
Тип:

поведенческий

Описан в Design Patterns

Да

Шаблон Посетитель (Visitor) — поведенческий Шаблон проектирования.

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

Содержание

Описание средствами псевдокода

interface Obj
{
    void visit(Visitor visitor, params);
}
 
interface Visitor
{
    void visitA(A a, params);
    void visitB(B b, params);
} 
 
class A implements Obj
{
    void visit(Visitor visitor, params) { visitor.visitA(this, params); }
}
 
class B implements Obj
{
    void visit(Visitor visitor, params) { visitor.visitB(this, params); }
}
 
class Visitor1 implements Visitor
{
    void visitA(A a, params);
    void visitB(B b, params);
}
 
class Visitor2 implements Visitor
{
    void visitA(A a, params);
    void visitB(B b, params);
}

Проблема

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

Решение

Для полной независимости посетители имеют отдельную от обслуживаемых структур иерархию. Структуры должны иметь некий интерфейс взаимодействия. При необходимости добавления новых операций необходимо создать новый класс ConcreteVisitor и поместить его в цепочку обхода обслуживаемых структур.

Рекомендации

Шаблон «Посетитель» следует использовать, если:

  • в структуре присутствуют объекты разных классов с различными интерфейсами, и необходимо выполнить над ними операции, зависящие от конкретных классов.
  • если над обслуживаемой структурой надо выполнять самые различные, порой не связанные между собой операции. То есть они усложняют эту структуру.
  • часто добавляются новые операции над обслуживаемой структурой.
  • реализация double dispatch. Концептуально это нечто вроде {a; b} -> method(params), где реально вызываемый по стрелочке метод зависит как от типа a, так и от типа b. Так как большинство объектно-ориентированных языков программирования не поддерживает такое на уровне синтаксиса, для такого обычно применяется Visitor в виде a -> visit(b, params), который в свою очередь вызывает b -> visitA(a, params), что дает выбор и по типу a, и по типу b.

Преимущества

  • упрощается добавление новых операций
  • объединяет родственные операции в классе «Посетитель».
  • экземпляр визитора может иметь в себе состояние (например, общую сумму) и накапливать его по ходу обхода контейнера.

Недостатки

  • затруднено добавление новых классов, поскольку требуется объявление новой абстрактной операции в интерфейсе визитора, а значит — и во всех классах, реализующих данный интерфейс.

Ссылки



Wikimedia Foundation. 2010.

Игры ⚽ Нужен реферат?

Полезное


Смотреть что такое "Посетитель (шаблон проектирования)" в других словарях:

  • Шаблон проектирования — У этого термина существуют и другие значения, см. Паттерн. В разработке программного обеспечения, шаблон проектирования или паттерн (англ. design pattern) повторимая архитектурная конструкция, представляющая собой решение проблемы… …   Википедия

  • Интерфейс (шаблон проектирования) — Шаблон проектирования Интерфейс Interface Описан в Design Patterns Нет В информатике, шаблон интерфейса не является особым шаблоном среди шаблонов проектирования. Он является общим методом для структурирования компьютерных программ для того …   Википедия

  • Хранитель (шаблон проектирования) — Шаблон проектирования Хранитель Memento Тип: поведенческий Описан в Design Patterns Да Хранитель (также известный как Memento, Token, Лексема) поведенческий шаблон проектирования. Позволяет, не нарушая инкапсуляцию, зафикс …   Википедия

  • Итератор (шаблон проектирования) — Шаблон проектирования Итератор Iterator Тип: поведенческий Описан в Design Patterns Да Шаблон Iterator (также известный как Cursor)  Шаблон проектирования, относится к паттернам поведения. Представляет собой объект, позволяющий получить …   Википедия

  • Интерпретатор (шаблон проектирования) — Шаблон проектирования Интерпретатор Interpreter Тип: поведенческий Назначение: решает часто встречающуюся, подверженную изменениям задачу Описан в Design Patterns Да Шаблон Интерпретатор (англ.  …   Википедия

  • Компоновщик (шаблон проектирования) — Шаблон проектирования Компоновщик Composite Тип: структурный Описан в Design Patterns Да Компоновщик (англ. Composite pattern) шаблон проектирования, относится к структурным паттернам, объединяет объек …   Википедия

  • Состояние (шаблон проектирования) — Шаблон проектирования Состояние State Тип: поведенческий Описан в Design Patterns Да Состояние (англ. State)  шаблон проектирования. Используется в тех случаях, когда во время выполнения программы объект …   Википедия

  • Приспособленец (шаблон проектирования) — Шаблон проектирования Приспособленец Flyweight Тип: структурный Описан в Design Patterns Да Приспособленец (англ. Flyweight)  это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не… …   Википедия

  • Наблюдатель (шаблон проектирования) — У этого термина существуют и другие значения, см. Наблюдатель. Шаблон проектирования Наблюдатель Observer Тип: поведенческий Описан в Design Patterns Да Наблюдатель, Observer  поведенческий шаблон проектирования. Также известен ка …   Википедия

  • Адаптер (шаблон проектирования) — У этого термина существуют и другие значения, см. Адаптер. Шаблон проектирования Адаптер Adapter …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»