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.