DesignPatterns. Decorator

Есть объект, выполняющий основную операцию. Требуется добавить дополнительную операцию до, после, либо вместо основной операции. Традиционный путь – через наследование приводит к комбинаторному взрыву подклассов. Другой подход (композиция) – создать новый класс декоратор со ссылкой на наш объект и вызвать основную операцию. А до нее, после или вместо вызвать необходимую нам дополнительную операцию.

В самом простом виде декорация могла бы выглядеть так. Пусть у нас есть некоторый главный объект, который выполняет некоторую главную операцию. И далее, нам нужно сделать что-то до выполнения главной операции.

program Decorator;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  uDecorator in 'uDecorator.pas';

var
  m: TMainObject;
  d: TDecoratorBefore;
begin
  try
    m := TMainObject.Create();
    d := TDecoratorBefore.Create(m);
    try
      d.DoSmthBeforeAndMainOperation();
    finally
      m.Free();
      d.Free();
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Класс декоратора

unit uDecorator;

interface

type
  TMainObject = class
  public
    function MainOperation(): string;
  end;

  TDecoratorBefore = class
    FMainObject: TMainObject;
  public
    constructor Create(aMainObject: TMainObject);
    function DoSmthBefore: string;
  end;

implementation

{ TMainObject }

function TMainObject.MainOperation: string;
begin
  Result := 'MainOperation';
end;

{ TDecoratorBefore }

constructor TDecoratorBefore.Create(aMainObject: TMainObject);
begin
  FMainObject := aMainObject;
end;

function TDecoratorBefore.DoSmthBefore: string;
begin
  Result := 'Do Smth Before ' + FMainObject.MainOperation();
end;

end.
This entry was posted in Без рубрики. Bookmark the permalink.