Translate

terça-feira, 16 de agosto de 2011

Exemplo de Padrão de Projeto Strategy em Delphi

O exemplo será apresentado através de uma necessidade, exportar uma lista de áudio para diferentes player (iTunes, Winamp, Windows Media Player) com seus respectivos formatos (xml, csv, txt).

Minha definição de Strategy nesse exemplo seria um conjunto de algorítimos independentes e encapsulado de acordo com o player / formato sendo consumido por um módulo comum de exportação.

Essa unit é responsável pela organização da exportação:

unit Exportacao;

interface

uses
  Classes,
  SysUtils;

type
  EExportcaoErro = class(Exception);

  TExportacao = class
  private
    FPlaylist: TStrings;
  public
    function GetPlayer: string; virtual; abstract;
    procedure Exportar; virtual; abstract;
    property Playlist: TStrings read FPlaylist write FPlaylist;
  end;

const
  PlayerNaoIntegrado = 'Não há integração com o player %s';

implementation

end.

Essa unit é responsável pela exportação para o iTunes:

unit ExportacaoItunes;

interface

uses
  Exportacao;

type
 TiTunes = class(TExportacao)
 private
   function ExportarXML: Boolean;
  public
    function GetPlayer: string; override;
    procedure Exportar; override;
 end;

implementation

procedure TiTunes.Exportar;
begin
  ExportarXML;
end;

function TiTunes.ExportarXML: Boolean;
begin
  // Exportar o conteúdo do Playlist no formamto XML conforme espeficicações do iTunes;
  raise EExportcaoErro.Create(PlayerNaoIntegrado);
end;

function TiTunes.GetPlayer: string;
begin
  Result := 'iTunes';
end;

end.

Essa unit é responsável pela exportação para o Windows Media Player:

unit ExportacaoWinamp;

interface

uses
  Classes,
  Exportacao;

type
  TWinamp = class(TExportacao)
  private
    procedure ExportarM3U;
  public
    function GetPlayer: string; override;
    procedure Exportar; override;
  end;

implementation

procedure TWinamp.Exportar;
begin
  ExportarM3U;
end;

procedure TWinamp.ExportarM3U;
begin
  // Exportar o conteúdo do Playlist no formamto M3U conforme espeficicações do Winamp;
  raise EExportcaoErro.Create(PlayerNaoIntegrado);
end;

function TWinamp.GetPlayer: string;
begin
  Result := 'Winamp';
end;

end.

Essa unit é responsável pelo exportação:

unit Principal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, 
  Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Exportacao;

type
  TFormExportacao = class(TForm)
    ButtonExportar: TButton;
    RadioGroupPlayer: TRadioGroup;
    MemoPlaylis: TMemo;
    procedure ButtonExportarClick(Sender: TObject);
  private
    procedure Exportar;
  end;

var
  FormExportacao: TFormExportacao;

implementation

uses
  ExportacaoWindowsMidiaPlayer,
  ExportacaoItunes,
  ExportacaoWinamp;

{$R *.dfm}

procedure TFormExportacao.ButtonExportarClick(Sender: TObject);
begin
  Exportar;
end;

procedure TFormExportacao.Exportar;
var
  Exportacao: TExportacao;
begin
  Exportacao := nil;
  try
    case RadioGroupPlayer.ItemIndex of
      0: Exportacao := TiTunes.Create;
      1: Exportacao := TWinamp.Create;
      2: Exportacao := TWindowsMidiaPlayer.Create;
      else
        ShowMessage('Não foi possível realizar a exportação');
    end;
    Exportacao.Playlist := MemoPlaylis.Lines;
    try
      Exportacao.Exportar;
      ShowMessage('Exportação realizada com sucesso no ' + Exportacao.GetPlayer);
    except
      on E: EExportcaoErro do
        ShowMessage(Format(E.Message, [Exportacao.GetPlayer]));
    end;
  finally
    Exportacao.Free;
  end;
end;

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.