Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns via C#.pdf
Скачиваний:
153
Добавлен:
17.03.2016
Размер:
13.25 Mб
Скачать

286

Реализация

С каждым объектом-элементом класса (ConcreteElement), ассоциирован некий класс (ConcreteVisitor) объекта-посетителя. В классах объектов посетителей (ConcreteVisitor), реализована операция VisitConcretElement, для каждого конкретного класса ConcreteElement. В каждой операции VisitConcretElement, имеется аргумент одного из классов ConcreteElement, благодаря этому посетитель может получить доступ к открытому (public) интерфейсу класса ConcreteElement. Классы ConcreteVisitor реализуют абстрактные методы VisitConcretElement из базового класса Visitor, с целью реализации в посетителе специфического поведения (функциональности), предназначенного для соответствующего класса ConcreteElement.

Каждый класс ConcreteElement реализует метод Accept, который вызывает соответствующий метод VisitConcretElement, на посетителе. Следовательно, какая будет в конечном итоге вызвана операция: OperationA или OperationB, зависит как от класса элемента ConcreteElement, так и от класса посетителя ConcreteVisitor.

Можно было бы использовать перегрузку методов, и вместо методов с разными оттенками имен

VisitConcretElementX и VisitConcretElementY, воспользоваться методами с одним именем - Visit.

Имеется два мнения по поводу использования перегрузки методов, одно за, другое против. Сторонники перегрузки подчеркивают, что все методы выполняют однотипную деятельность, хоть и имеют разные аргументы. Противники перегрузки бояться, что читателю программы будет затруднительно понимать, что именно происходит (кого требуется посетить) при вызове метода с именем Visit. Считаются оба варианта приемлемыми (допустимыми), применимость перегрузки зависит от предпочтений программиста.

Известные применения паттерна в .Net

Паттерн Visitor, выражен в платформе .Net в виде идеи использования расширяющих методов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]