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.