Strategy pattern de forma rápida

Fala galeeeraaa, esse é o segundo post da série “De Forma Rápida”, que tem como intuito dar uma breve introdução de um tema.
🧐 O que é ?
Strategy Pattern é mais um dos padrões comportamentais que trata das comunicações entre objetos, especialmente em termos de responsábilidade e de algoritmos, com o intuito de encapsular regras por condições, evitando ter que fazer o uso de IF/ELSE, dessa forma tornando a implementação mais simples e de fácil leitura.
Talvez fica mais fácil através desse fluxograma:
(Fluxograma Strategy Pattern.)
🕵️♂️ Quais problemas podemos utilizar?
-
Quando você tem em seu código vários algoritmos diferentes que usam o mesmo cálculo, um exemplo na vida real seria quando você compra algo pela internet e há várias opções de frete, as transportadoras usam o mesmo cálculo através do seu endereço, CEP, etc.
-
Quando você tem várias condições para tomar um rumo de qual comportamento seguir, trazendo para vida real, quando você precisa transitar pela cidade há várias opções taxi, uber, ônibus entre outros.
🤔 Por que devo utilizar Strategy Pattern no código?
- Para facilitar a organizações de classes. 😄
- Centralizar a usabilidade. 😯
- Dividir responsabilidades. 🧠
- Tomada de decisões em real time(Tempo real). 😱
- Diminiur o uso de IF/ELSE. 🤩
Exemplo de Strategy Pattern
Digamos que você está querendo transitar pela cidade e tem que escolher uma estratégia de meio de transporte mais viável e acessível ao mesmo tempo, assim seria o código.
/**
* Contexto.
*/
class Transitar {
escolherEstrategia(meioTransporte) {
this.meioTransporte = meioTransporte
}
/**
* Estratégia.
*/
calcular(preco) {
if (!this.meioTransporte) {
throw new Error('Nenhum meio de transporte')
}
return this.meioTransporte.calcular(preco)
}
}
/**
* Estratégia ônibus.
*/
class Onibus extends Transitar {
calcular(preco) {
return 'R$ 4,25'
}
}
/**
* Estratégia taxi.
*/
class Taxi extends Transitar {
calcular(preco) {
return 'R$ 25,30'
}
}
/**
* Estratégia uber.
*/
class Uber extends Transitar {
calcular(preco) {
return 'R$ 15,41'
}
}
/**
* Estratégia a pé.
*/
class Pe extends Transitar {
calcular(preco) {
return 'De graça'
}
}
const preco = {}
const onibus = new Onibus()
const taxi = new Taxi()
const uber = new Uber()
const pe = new Pe()
const transitar = new Transitar()
/**
* Retorna o valor do meio de transporte ônibus.
*/
transitar.escolherEstrategia(onibus)
console.log('Onibus: ' + transitar.calcular(preco))
/**
* Retorna o valor do meio de transporte taxi.
*/
transitar.escolherEstrategia(taxi)
console.log('Taxi: ' + transitar.calcular(preco))
/**
* Retorna o valor do meio de transporte uber.
*/
transitar.escolherEstrategia(uber)
console.log('Uber: ' + transitar.calcular(preco))
/**
* Retorna o valor de andar a pé.
*/
transitar.escolherEstrategia(pe)
console.log('Pé: ' + transitar.calcular(preco))
}
🔗 Referências
Você pode estudar um pouco mais do assunto nos links: 🎓
- https://medium.com/@lucasdeoliveiragonalves/design-patterns-strategy-1479a37f5cb
- https://www.treinaweb.com.br/blog/refatorando-codigo-php-para-strategy-pattern/
“Não deixe o ruído das opiniões dos outros abafar a sua própria voz interior.” 🧐
comments powered by DisqusWilliam Koerich.