1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Dúvida sobre uma implementação usando strategy

Ola amigos,

Tenho varias funcionalidades que geram 'extratos' e que são exportados via txt , cada funcionalidade dessa tem um padrão de informação que é preenchida no arquivo , entretanto , a implementação é igual pra todas elas..cabendo apenas separar a particularidades de cada funcionalidade.

Comecei assim:

public interface ExtratoStrategy{

   String linhaDeExtrato;
   String linhaInformacoesAdicionais; 
}

Pra manter a implementação igual entre as funcionalidades , criei um objeto chamado Extrato , que vai saber gerar a linha com determinada informação..mas sem saber pra qual funcionalidade é o extrato

public class Extrato{

   private final BigDecimal valorLancamento;
   private final Date dataEmissao;
   //outros campos


   public String gerarExtrato(){
      return informacaoExtrato();
   }

   public String gerarInformacoesAdicionais(){
      return linhaInformacoesAdicionais();
   }



   private String informacaoExtrato(){
     //implementacao que gera a linha
   }

    private String linhaInformacoesAdicionais(){
     //implementacao que gera a linha
   }

   //Builder para garantir encapsulamento
   public static class ExtratoBuilder{

     private BigDecimal valorLancamento;
     private Date dataEmissao;
     //outros campos 
   }
}

Para conseguir diferenciar pra qual funcionalidade eu estou gerando o extrato eu criei objeto chamado EventoContabil

public class EventoContabil{

  private String nomeEvento;
  private String historicoEvento;
   //outros campos

}

Para cada funcionalidade eu criei uma classe que vai implementar a interface ExtratoStrategy

public class ExtratoFuncaoXPTOStrategy implements ExtratoStrategy{

   private final BigDecimal valor;
   private final Date data;
   private final EventoContabil evento;

   //injeto valores pelo construtor
   public ExtratoFuncaoXPTOStrategy(BigDecimal valor , Date data , EventoContabil evento){
      this.valor = valor;
      this.data = data;
      this.evento = evento;
   }  

   public String linhaDeExtrato(){
      //Chamo Builder da classe Extrato , passando parametros acima e gero a linha
   }

   public String linhaInformacoesAdicionais(){
             //Chamo Builder da classe Extrato , passando parametros acima e gero a linha
   }



}
public class ExtratoFuncaoXYZStrategy implements ExtratoStrategy{

   private final BigDecimal valor;
   private final Date data;
   private final EventoContabil evento;

   //injeto valores pelo construtor
   public ExtratoFuncaoXYZStrategy(BigDecimal valor , Date data , EventoContabil evento){
      this.valor = valor;
      this.data = data;
      this.evento = evento;
   }  

   public String linhaDeExtrato(){
      //Chamo Builder da classe Extrato , passando parametros acima e gero a linha
   }

   public String linhaInformacoesAdicionais(){
             //Chamo Builder da classe Extrato , passando parametros acima e gero a linha
   }



}

E na camada de negocio ficou assim:

public class ExtratoFuncaoXPTOBOImpl implements ExtratoFuncaoXPTOBO{

   public String gerarLinhaExtrato(Data dataEmissao ){

      //vou no banco e busco valor pra um determinado periodo
      BigDecimal valor = dao.buscarValor(dataEmissao)

      //crio um objeto do tipo EventoContabil , passando as informações que são especificas daquela funcionalidade
      EventoContabil eventoXPTO = new EventoContabil(a , b , c ...)

      //crio instancia da classe ExtratoFuncaoXPTOStrategy 
      ExtratoFuncaoXPTOStrategy  xptoStrategy = new ExtratoFuncaoXPTOStrategy ( valor , data , eventoXPTO);

      return xptoStrategy.linhaDeExtrato(); 

   }

}
public class ExtratoFuncaoXYZBOImpl implements ExtratoFuncaoXYZBO{

   public String gerarLinhaExtrato(Data dataEmissao ){

      //vou no banco e busco valor pra um determinado periodo
      BigDecimal valor = dao.buscarValor(dataEmissao)

      //crio um objeto do tipo EventoContabil , passando as informações que são especificas daquela funcionalidade
      EventoContabil eventoXYZ = new EventoContabil(a , b , c ...)

      //crio instancia da classe ExtratoFuncaoXYZStrategy 
      ExtratoFuncaoXYZStrategy  xtzStrategy = new ExtratoFuncaoXYZStrategy ( valor , data , eventoXYZ);

      return xtzStrategy.linhaDeExtrato(); 

   }

}

Depois desse textão(eu sei ficou grande , mas queria ser o mais detalhista possível) vem minhas duvidas:

  • Consegui efetivamente extrair o conceito do Strategy de forma correta?
  • As classes que implementam ExtratoStrategy ficaram muito parecidas , eu não estaria violando a regra do DRY(Don't repeat yourself)?
  • Como eu poderia melhorar essa implementação?

Obrigado.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java design-patterns ou faça a sua própria pergunta.