Главная » Delphi » Delphi 2006 – Шаблон Visitor (Посетитель)

0

Последний из рассматриваемых здесь шаблонов, Посетитель, позволяет выделить некоторый набор операций, характерный для множества классов с различными структурами. Этот набор по различным причинам нежелательно вносить в описание классов (например, он может постоянно расширяться, а число различных классов, подлежащих модификации, велико), и в то же время вызываться должны методы, четко привязанные к конкретным контекстам исполнения (рис. 7.24).

Изложенная схема реализуется с помощью шаблона Посетитель следующим образом. Существует интерфейс iElement:

IElement = interface

procedure Accept(AVisitor :IVisitor)? end?

Puc. 724. Шаблон Посетитель в Дизайнере модели

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

IVisitor = interface

procedure VisitTConcreteElement (AElement : TConcreteElement);

end;

Здесь процедура VisitTConcreteElement в свою очередь получает ссылку на конкретный класс как параметр, необходимый для доступа к его состоянию.

Реализация метода Accept представляет собой вызов нужного метода конкретного класса, поддерживающего интерфейс iElement.

TConcreteElement = class(TObject, IElement) public

procedure Accept (AVisitor :IVisitor>-;

end;

procedure TConcreteElement.Accept(AVisitor :IVisitor); begin

AVisitor.VisitTConcreteElement(self); end;

Пусть имеются два класса: TConcreteElement и TConcreteElement2, каким-то образом различающиеся по внутреннему описанию, но поддерживающие интерфейс IElement. Для каждого из них в интерфейсе TVisitor описывается свой метод.

IVisitor = interface

procedure VisitTConcreteElement (AElement : TConcreteElement);

procedure VisitTConcreteElement2 (AElement : TConcreteElement2);

end;

procedure TConcreteElement.Accept(AVisitor :IVisitor); begin

AVisitor.VisitTConcreteElement(self); end;

procedure TConcreteElement2.Accept(AVisitor :IVisitor); begin

AVisitor.VisitTConcreteElement2(self); end;

В клиентском коде работа с такой структурой обычно происходит путем перебора всех или некоторого подмножества экземпляров классов, поддерживающих интерфейс iElement, для каждого из них с вызывом метода Accept:

var eel: TConcreteElement; ce2: TConcreteElement2; iv: IVisitor;

iv := TConcreteVisitor.Create; cel:= TConcreteElement.Create; ce2:= TConcreteElement2.Create;

// здесь реализуется перебор объектов eel, се2, . .., ceN:

eel.Accept(iv); ce2.Accept(iv);

Какие конкретно методы вызываются, в клиентском коде понять нельзя благодаря инкапсуляции. В дальнейшем перечень операций, допустимых над объектами (в дополнение к единственному пока методу Accept), можно расширять, не внося в дополнительный код уже существующие классы.

Бобровский С. И. Технологии Delphi 2006. Новые возможности. — СПб.: Питер, 2006. — 288 е.: ил.

По теме:

  • Комментарии