Design Pattern - Strategy
Padrões de Projetos com Strategy
Como esse recurso pode ser útil?
O padrão de projeto Strategy é muito útil quando queremos que parte do nosso algoritmo respeite alguma regra específica. Com ele, podemos criar código mais limpo e classes com menos responsabilidades, reduzindo o uso de condicionais que fazem com que o código gerado fique mais complexo. Ele facilita também a introduzir novas regras ao nosso código, quando necessário.
Como utilizar?
Estrutura das classes
Na imagem abaixo conseguimos visualizar um diagrama de classes representando as classes necessárias para implementar o Strategy.

Diagrama de Classes
Implementação
Para implementá-lo, precisamos ter uma Interface com o método comum a ser utilizado pelas diferentes estratégias.
public interface Strategy {
double calculate(Double value);
}
Para cada estratégia, precisamos criar uma nova classe que a implementa. Nessa classes, incluímos o código específico para a regra em questão.
Exemplo de uma das estratégias, em que o valor é multiplicado por 0.03.
public class StrategyAImpl implements Strategy {
public double calculate(Double value) {
return value * 0.03;
}
}
Exemplo de uma segunda estratégia, em que o valor é multiplicado por outro valor que é o 0.05.
public class StrategyBImpl implements Strategy {
public double calculate(Double value) {
return value * 0.05;
}
}
Em um nível acima, temos a classes com todo o algoritmo a ser executado. Em nosso caso, representamos ela com a classe ExecuteStrategy. Ela recebe em seu construtor a estratégia a ser executada. No método de execução, ela realiza o cálculo e em seguida simula a impressão do resultado.
public class ExecuteStrategy {
private Strategy strategy;
public ExecuteStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void execute(Double value) {
double result = strategy.calculate(value);
printResult(result);
}
private void printResult(double result) {
System.out.println("Result of " + strategy + " is: " + result);
}
}
A classe abaixo possui método que nos ajuda a testar e visualizar o resultado de cada uma das operações, utilizando as diferentes estratégias.
public class RunStrategies {
public static void main(String[] args) {
Double valueToCalculate = 100.0;
System.out.println("Value to calculate is: "+ valueToCalculate);
//Execute the Strategy A
ExecuteStrategy executeStrategyA = new ExecuteStrategy(new StrategyAImpl());
executeStrategyA.execute(valueToCalculate);
//Execute the Strategy B
ExecuteStrategy executeStrategyB = new ExecuteStrategy(new StrategyBImpl());
executeStrategyB.execute(valueToCalculate);
//Execute the Strategy C
ExecuteStrategy executeStrategyC = new ExecuteStrategy(new StrategyCImpl());
executeStrategyC.execute(valueToCalculate);
//Example of new rule that the Product Owner needs for the next month
ExecuteStrategy executeStrategyD = new ExecuteStrategy(new StrategyDImpl());
executeStrategyD.execute(valueToCalculate);
}
}
Fontes do projeto
https://github.com/augustocolombelli/design-pattern-strategy/