Strategy
Strategy é um padrão de projeto de software (do inglês design pattern). O objetivo é representar uma operação a ser realizada sobre os elementos de uma estrutura de objetos. O padrão Strategy permite definir novas operações sem alterar as classes dos elementos sobre os quais opera. Definir uma família de algoritmos e encapsular cada algoritmo como uma classe, permitindo assim que elas possam ter trocados entre si. Este padrão permite que o algoritmo possa variar independentemente dos clientes que o utilizam.
[editar] Aplicação
Utilizar o padrão Strategy quando:
•um objeto deve ser parametrizado com um de vários algoritmos, os quais podem ser encapsulados e representados por uma única interface.
Segue um exemplo em Java onde o valor de comissão difere de acordo com o cargo do funcionario.
/**
* Enumeration de cargos.
*/
public enum Cargo {
ATENDENTE,
VENDEDOR,
GERENTE;
}
/**
* Dados do funcionario.
*/
public class Funcionario {
private long id;
private enum cargo;
// Construtor, getters e setters
. . .
}
/**
* Interface pattern Strategy.
*/
public interface Strategy {
// Calcula comissão.
double calcularComissao(double valorVenda);
}
/**
* Classe que calcula comissão de venda.
*/
public class Venda {
private double valorVenda;
private Funcionario funcionario;
private Strategy calculoComissao;
// Construtor [Implementa STRATEGY].
public Venda() {
switch (funcionario.getCargo()) {
case ATENDENTE :
this.setCalculoComissao(new Strategy() {
@Override
public double calcularComissao(double valorVenda) {
return (valorVenda * 0.01);
}
});
break;
case VENDEDOR :
this.setCalculoComissao(new Strategy() {
@Override
public double calcularComissao(double valorVenda) {
return (valorVenda * 0.02);
}
});
break;
case GERENTE :
this.setCalculoComissao(new Strategy() {
@Override
public double calcularComissao(double valorVenda) {
return (valorVenda * 0.03);
}
});
break;
}
}
private void setCalculoComissao(Strategy calculoComissao) {
this.calculoComissao= calculoComissao;
}
private Strategy getCalculoComissao() {
return (this.calculoComissao);
}
public void save() {
//. . .
/*
* Calcula o valor da comissão de venda sem que haja a necessidade de
* verificar qual o tipo cargo toda vez que o metodo <b>save</b> for executado.
*/
final double valorComissao = this.getCalculoComissao().calcularComissao(this.valorVenda);
// . . .
}
}
}