Translate

segunda-feira, 29 de agosto de 2011

Exemplo de Padrão de Projeto Decorator em Delphi

O exemplo será apresentado através de uma necessidade, adicionar acessórios (Bluetooth, 3G, WiFi) na montagem de celular, calculando o valor final do produto.

Minha definição de Decorator nesse exemplo seria adicionar os acessórios dinamicamente no objeto Celular.

Essa unit é responsável pela classe celular e subclasses para obter diferentes decorações:

unit CelularDecorator;

interface

type
  ICelular = interface
    function Valor: Currency;
  end;

  TCelular = class(TInterfacedObject, ICelular)
  public
    function Valor: Currency; virtual; abstract;
  end;

  TCelularDecorator = class(TCelular)
  private
    FCelular: ICelular;
  public
    function Valor: Currency; override;
    constructor Create(ACelular: ICelular);
  end;

  TTelefonia = class(TCelular)
  public
    function Valor: Currency; override;
  end;

  TBluetooth = class(TCelularDecorator)
  public
    function Valor: Currency; override;
  end;

  T3G = class(TCelularDecorator)
  public
    function Valor: Currency; override;
  end;

  TWiFi = class(TCelularDecorator)
  public
    function Valor: Currency; override;
  end;

implementation

constructor TCelularDecorator.Create(ACelular: ICelular);
begin
  FCelular := ACelular;
end;

function TCelularDecorator.Valor: Currency;
begin
  Result := inherited Valor;
end;

function TBluetooth.Valor: Currency;
begin
  Result := FCelular.Valor + 10.00;
end;

function T3G.Valor: Currency;
begin
  Result := FCelular.Valor + 15.15;
end;

function TWiFi.Valor: Currency;
begin
  Result := FCelular.Valor + 20.20;
end;

function TTelefonia.Valor: Currency;
begin
  Result := 100;
end;

end.

Esse método instância a classe TCelular e suas subclasse que adiciona os acessórios:

procedure TFormPrincipal.ButtonCalcularValorCelularClick(Sender: TObject);
var
  Celular: ICelular;
begin
  Celular := TTelefonia.Create;
  Memo.Lines.Add('Valor original do celular: R$ ' + FormatCurr('###,##0.00', Celular.Valor));

  Celular := TBluetooth.Create(Celular);
  Memo.Lines.Add(' + Bluetooth: R$ ' + FormatCurr('###,##0.00', Celular.Valor));

  Celular := T3G.Create(Celular);
  Memo.Lines.Add(' + 3G: R$ ' + FormatCurr('###,##0.00', Celular.Valor));

  Celular := TWiFi.Create(Celular);
  Memo.Lines.Add(' + WiFi: R$ ' + FormatCurr('###,##0.00', Celular.Valor));
end;

Mais detalhes no repositório https://bitbucket.org/brunosanson/design-patterns-em-delphi/

Nenhum comentário:

Postar um comentário

Deixe seu comentário aqui.