Strategy
Definição
O padrão Strategy define uma família de algoritmos, encapsula cada um deles e os torna intercambiáveis. O algoritmo pode variar independentemente do cliente que o utiliza.
Esse padrão é útil quando você tem várias formas diferentes de executar uma tarefa, e quer poder alternar entre elas em tempo de execução, sem alterar o código que usa a lógica.
Por que é importante
O padrão Strategy define uma família de algoritmos
encapsulados, que podem ser trocados livremente em tempo
de execução, sem alterar o código que os utiliza. Também ajuda a eliminar
estruturas condicionais (como if
/elif
)
repetitivas e torna o sistema mais modular e extensível.
Esse padrão é ideal para regras de cálculo, validações, formatações ou qualquer situação em que o comportamento deva poder variar de forma controlada.
Exemplo prático (Python)
Imagine um sistema de cálculo de frete que pode usar diferentes estratégias de transporte:
from abc import ABC, abstractmethod
# Estratégia base
class EstrategiaFrete(ABC):
@abstractmethod
def calcular(self, peso):
pass
# Estratégias concretas
class FreteExpresso(EstrategiaFrete):
def calcular(self, peso):
return 30 + peso * 1.5
class FretePadrao(EstrategiaFrete):
def calcular(self, peso):
return 20 + peso * 1.0
class FreteEconomico(EstrategiaFrete):
def calcular(self, peso):
return 10 + peso * 0.8
# Contexto
class CalculadoraDeFrete:
def __init__(self, estrategia: EstrategiaFrete):
self.estrategia = estrategia
def calcular(self, peso):
return self.estrategia.calcular(peso)
Agora podemos alternar entre as estratégias sem mudar a lógica da calculadora:
peso = 5
calculadora = CalculadoraDeFrete(FretePadrao())
print("Padrão:", calculadora.calcular(peso))
calculadora = CalculadoraDeFrete(FreteExpresso())
print("Expresso:", calculadora.calcular(peso))
calculadora = CalculadoraDeFrete(FreteEconomico())
print("Econômico:", calculadora.calcular(peso))
O cliente (a calculadora) não precisa saber os detalhes de cada cálculo. Ele apenas usa a estratégia definida no momento da execução. Se uma nova estratégia de frete surgir no futuro, basta implementá-la como uma nova classe sem alterar o código da calculadora — respeitando o princípio aberto/fechado.