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.