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.

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:
- 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.
- 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.