DesignPatterns. Bridge

Абстракция и имплементация могут развиваться отдельно. В нужный момент мы их связываем.

Пример из жизни – 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.
This entry was posted in Без рубрики. Bookmark the permalink.