quinta-feira, 4 de agosto de 2011

Strategy - Separando os comportamentos - Parte 1

O padrão de projeto Strategy define uma família de algoritmos, encapsula cada um e os torna intercambiáveis, traduzindo, definimos uma interface, criamos várias implementações para essa interface, e podemos mudar o comportamento do objeto trocando a implementação utilizada. Podemos inclusive fazer isso em runtime.

Vamos observar o diagrama abaixo.






A interface IExporterStrategy define o comportamento da estratégia, no caso, uma propriedade FileName que define o nome do arquivo de destino e um método ExportToFile que executa a exportação em si. No diagrama está definido três implementações para o estrategy: Text, XML e CSV, e uma classe TExporterContext que representa o contexto da aplicação no qual a rotina de exportação está inserida.

É importante ressaltar o relacionamento entre a classe TExporterContext e o Strategy. A classe depende apenas da interface, desconhecendo qualquer implementação. Isso é um bom indicador para o nosso design, pois, estamos programando para uma interface, não para uma implementação (Interface no sentido de abstração).

Note também a classe TExporterStrategyFactory. Ela é uma Simple Factory, uma classe comum com um método de classe que retornará uma instância para a classe de contexto. Quando fazemos isso, estamos invertendo o controle dos objetos, o contexto não tem controle sobre qual implementação será retornada pela Factory. Qualquer mudança no que diz respeito a instanciação, faremos apenas na Factory, por exemplo, queremos substituir o framework de manipulação de xml, então, criamos mais uma implementação do Strategy e modificamos a factory para retornar essa implementação.

A nomenclatura das classes também é importante, pois, um dos objetivos dos patterns é criar uma linguagem comum, de modo que a comunicação seja facilitada. E de fato olhando para o diagrama há uma rápida identificação dos padrões adotados para resolver o problema.

No próximo post vou mostrar como fica a implementação dessas classes em delphi.

Até a próxima.

2 comentários:

  1. Fabricio,

    Fica uma dica para postagem de imagem...

    http://www.lokeshdhakar.com/projects/lightbox2/

    Att,

    Sakamoto

    MyTraceLog - Registro de um DBA
    http://mytracelog.blogspot.com

    ResponderExcluir
  2. @Sakamoto Excelente dica, já incorporei ao site. Obrigado.

    ResponderExcluir