Главная » Delphi » Шаблон Bridge (Мост)

0

Шаблон Мост отделяет интерфейсную часть от ее реализации, причем не так, как это выполнено в абстрактных классах, где модификация их описания вызывает необходимость внесения изменений во все классы-наследни- ки, а независимо. То есть, изменив описание интерфейса с помощью Моста, можно не выполнять массовой переделки всех его подклассов (рис. 7.8).

Внешний интерфейс в этом шаблоне представлен абстрактным классом TAbstraction.

TAbstraction = claee abetract

///<1ink>aggregation</1ink> Flmpl:TImplementor;

etrict protected

function getlmplementor: TImplementor; procedure setlmplementor(im: TImplementor);

public

///< i ssubroutine>True</is subrout ine> function SomeOperation: Integer ; end;

Puc. 7.8. Шаблон Мост в Дизайнере модели

procedure TAbstraction.setlmplementor(im: TImplementor); begin

Flmpl := intend;

Ha его основе формируется конкретный интерфейс-потомок, который и используется в проекте, например класс MyClass:

MyClass = class(TAbstraction) end;

Однако метод SomeOperation в класс MyClass включать не обязательно. Он в данном случае не требуется для реализации нужной функциональности, как в случае с обычным наследованием. В этом методе обычно находится только обращение к нужному методу класса реализации, поэтому в классе-наследнике MyClass этот метод можно не реализовывать. А на уровне TAbstraction в методе происходит обращение к полю Flmpl — экземпляру класса TImplementor, который и занимается реализацией интерфейса TAbstraction (она полностью скрыта от внешнего пользователя класса TAbstraction).

function TAbstraction.SomeOperation: Integer ; begin

result := getImplementor().SomeOperationlmpl(5); end;

За реализацию отвечает абстрактный класс TImplementor

TImplementor = class abstract public

function SomeOperationlmpl(i:Integer): Integer; virtual; abstract; end;

Скрытая ссылка на него хранится в классе описания интерфейса. По аналогии с классом MyClass, реализация данного класса также формируется на основе наследования.

TConcretelmplementor = class(TImplementor) public

function SomeOperationlmpl(i:Integer): Integer; override;

end;

function TConcretelmplementor.SomeOperationlmpl (i:Integer): Integer; begin

result := i*i; end;

Кроме того, класс MyClass надо дополнить конструктором, в котором соз дается экземпляр класса реализации.

MyClass = class(TAbstraction) public

constructor Create;

end;

conetruetor MyClass.Create; begin inherited;

setImplementor( TConcretelmplementor.Create ); end;

^^ Обычно класс TConcretelmplementor не используется напрямую. Его возможности наследуются несколькими классами-потомками, что позволяет очень гибко менять реализацию одного и того же интерфейса TAbstraction. Для этого, например, достаточно в классах-наследниках TAbstraction лишь изменить конструктор, указав тот или иной класс реализации.

Тогда в прикладном коде обращение к этому классу может записываться так.

var ad: TAbstraction; ad := MyClass.Create;

labell.Text := ad.SomeOperation.ToString; // обращение к методу SomeOperation интерфейса

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

По теме:

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