Strategy Design Pattern

Aplicando Strategy Design Pattern em javascript

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.