Есть объект, выполняющий основную операцию. Требуется добавить дополнительную операцию до, после, либо вместо основной операции. Традиционный путь – через наследование приводит к комбинаторному взрыву подклассов. Другой подход (композиция) – создать новый класс декоратор со ссылкой на наш объект и вызвать основную операцию. А до нее, после или вместо вызвать необходимую нам дополнительную операцию.
В самом простом виде декорация могла бы выглядеть так. Пусть у нас есть некоторый главный объект, который выполняет некоторую главную операцию. И далее, нам нужно сделать что-то до выполнения главной операции.
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.