Fala galera, tudo bem com vocês?
Hoje estarei falando um pouco sobre esse padrão de projetos e dando alguns exemplos para ficar mais claro o objetivo e as vantagens do uso dele nas suas aplicações.
- O Strategy é um padrão de projeto comportamental e foi "definido" pela Gang of Four.
- Ele foi criado para permitir que fosse possível alterar o comportamento de uma "classe" em momento de execução.
Como implementar o Strategy design pattern em javascript
Existem diversas formas de implementar esse padrão de projeto no javascript. Alguns usam classes e outros ainda utilizam prototype, aqui estarei demonstrando como implementar o Strategy utilizando funções simples.
Vamos então a implementação de padrão de projeto.
Pensando em um contexto de envio de encomendas, o usuário pode escolher qual a forma de envio do seu produto e cada transportadora(ou forma de envio), tem suas peculiaridades, como formula de cálculo do valor do frete e tempo estimado para a entrega.
Então pra esse caso o Strategy vai funcionar muito bem, pois a gente precisa mudar a estratégia que será usada para o cálculo da entrega.
const Transportadora = function () {
return {
setStrategy: function (empresa) {
this.empresa = empresa;
},
calcularFrete: function (pacote) {
return this.empresa.calcularFrete(pacote);
},
};
};
// Regras de cálculo
// Preço do frete: peso * 1.50
// Tempo estimado para a entrega: distanciaDestino / 10000
const SEDEX = function () {
return {
calcularFrete: function (pacote) {
return {
precoFrete: pacote.peso * 1.5,
tempoEntrega: pacote.distanciaDestino / 10000,
};
},
};
};
// Regras de cálculo
// Preço do frete: peso * 1.17
// Tempo estimado para a entrega: distanciaDestino / 8000
const PAC = function () {
return {
calcularFrete: function (pacote) {
return {
precoFrete: pacote.peso * 1.17,
tempoEntrega: pacote.distanciaDestino / 8000,
};
},
};
};
const transportadora = Transportadora();
const sedex = SEDEX();
const pac = PAC();
const pacote = {
peso: 200,
distanciaDestino: 250000,
};
transportadora.setStrategy(sedex);
transportadora.calcularFrete(pacote); // precoFrete = 300; tempoEntrega = 25
transportadora.setStrategy(pac);
transportadora.calcularFrete(pacote); // precoFrete = 234; tempoEntrega = 31.25
Veja que nesse exemplo seria possível ter um lugar na aplicação que o usuário escolhesse a opção de frete e em tempo de execução nosso objeto transportadora teria a lógica de cálculo alterada.