Padrão Strategy

O padrão de projeto Strategy tem como objetivo encapsular diferentes implementações de algoritmos, de forma que possa ser chamado a implementação conforme a estratégia do cliente.

Conforme a imagem abaixo, o contexto contem uma interface da estratégia, que define qual implementação de ser requisitada. Com isso, as classes ConcreteStrategyA, ConcreteStrategyB e ConcreteStrategyC são classes concretas que implementam os métodos da interface Strategy.

Design Patterns - Strategy
Design Patterns – Strategy

Por exemplo, no código abaixo poderia ser aplicado o padrão Strategy:

 
public class CalculadorDeUnidades {

   public static void main(String[] args) {
       final Pedido pedido = new Pedido;
       realizaCalculo(pedido, "Kg");
       realizaCalculo(pedido, "Cx");
   }   

   public void realizaCalculo(Pedido pedido, String unidadeMedida) {
       if( "KG".equals(unidadeMedida) ) {
           BigDecimal kg = pedido.getQuantidade().multiply(BigDecimal.valueOf(0.01));
       } else if( "Cx".equals(unidadeMedida) ) {
           BigDecimal cx = pedido.getQuantidade().multiply(BigDecimal.valueOf(0.045));
       }
   }
}

Há dois problemas nessa implementação:

  1. As implementações dos cálculos estão dentro de IFs, o que aumenta a complexidade do código e provê uma desorganização maior no código, onde em caso da existência de 10 unidades de medidas, teriam 10 IFs aninhados.
  2. A variável que define a unidade de medida é uma String, ou seja, não tem um tipo definido o que pode possibilitar um erro na chamada do calculo, caso o texto contido não esteja exatamente igual ao definido dentro do IF.

Aplicando o padrão Strategy no código:

public interface UnidaMedida {
    BigDecimal calcula(Pedido pedido;
}

public class Kg implements UnidaMedida {
    public BigDecimal calcula(Pedido pedido {
        return pedido.getQuantidade().multiply(BigDecimal.valueOf(0.01));
    }
}

public class Cx implements UnidaMedida {
     public BigDecimal calcula(Pedido pedido {
        return pedido.getQuantidade().multiply(BigDecimal.valueOf(0.045));
     }
}
public class TesteDeUnidadeMedida {

     public static void main(String[] args) {
          final UnidaMedida kg = new Kg();
          final UnidaMedida cx = new Cx();

          final Pedido pedido = new Pedido(10);

          final CalculadorDeQuantidade calculador = new CalculadorDeQuantidade();
          calculador.realizaCalculo(pedido, kg);       
          calculador.realizaCalculo(pedido, cx);
     }
}

O resultado da aplicação do padrão Strategy é um código com maior organização, sem IFs e com maior segurança na manutenção devido a existencia do contrato UnidadeMedida, que força suas implementações concretas definirem as ações desejadas.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.