Абстракция и имплементация могут развиваться отдельно. В нужный момент мы их связываем.
Пример из жизни – GUI и BackEnd. Могут развиваться отдельно, но в определенный момент мы их связываем.
Канонический пример. Пусть есть некоторый метод Operatoin в абстракции и имплементации. Этот метод и будет являться связью.
program Bridge;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
uBridge in 'uBridge.pas';
var
a: TAbstraction;
i: TImplementor;
begin
i := TConcreteImplementor();
a := TRefinedAbstraction.Create(i); // связали абстракцию и имплементацию
try
a.Implementor.Operation();
finally
i.Free();
a.Free();
end;
end.
Классы Bridge
unit uBridge;
interface
uses
System.SysUtils;
type
TImplementor = class
public
procedure Operation(); virtual; abstract;
end;
TConcreteImplementor = class(TImplementor)
public
procedure Operation(); override;
end;
TAbstraction = class
private
FImplementor: TImplementor;
public
constructor Create(aImplementor: TImplementor);
procedure Operation(); virtual; abstract;
property Implementor: TImplementor read FImplementor;
end;
TRefinedAbstraction = class(TAbstraction)
procedure Operation(); override;
end;
implementation
{ TAbstraction }
constructor TAbstraction.Create(aImplementor: TImplementor);
begin
FImplementor := aImplementor;
end;
{ TConcreteImplementator }
procedure TConcreteImplementor.Operation;
begin
Writeln('Some operation of concrete Implementor');
end;
{ TRefinedAbstraction }
procedure TRefinedAbstraction.Operation;
begin
Implementor.Operation();
end;
end.