Pular para o conteúdo

Boas práticas e padrões · Padrões comportamentais · 4 min de leitura

Strategy

Encapsula algoritmos intercambiáveis atrás de uma interface, escolhidos em tempo de execução.

Usuário → ListaProdutos1ListaProdutos → Ordenacao2Ordenacao → MenorPreco3Ordenacao → MaisVendidosOrdenacao → AvaliacaoUsuário — escolhe "menor preço"Usuárioescolhe "menor preço"ListaProdutos — contextoListaProdutoscontextoOrdenacao — estratégiaOrdenacaoestratégiaMenorPrecoMenorPrecoMaisVendidosMaisVendidosAvaliacaoAvaliacao

Arraste para o lado para ver o diagrama inteiro.

A lista não sabe como ordenar: recebe a estratégia escolhida e a usa. Trocar o critério não muda a lista.

O padrão

Define uma família de algoritmos, encapsula cada um e os torna intercambiáveis. É a aplicação mais direta do princípio aberto/fechado. Exemplos: cálculo de frete por transportadora, regras de desconto, formatos de exportação (CSV, PDF), compressão.

Funções como estratégia

Em Kotlin e TypeScript, uma estratégia muitas vezes é só uma função: Comparator, (Double) -> Double, fun interface. Use classe quando a estratégia tiver estado ou várias operações.

No código

✓ ExemploTypeScript
type Ordenacao = (a: Produto, b: Produto) => number;

const ORDENACOES: Record<string, Ordenacao> = {
  'menor-preco': (a, b) => a.preco - b.preco,
  'mais-vendidos': (a, b) => b.vendas - a.vendas,
  avaliacao: (a, b) => b.nota - a.nota || b.avaliacoes - a.avaliacoes,
};

function listar(produtos: Produto[], criterio: keyof typeof ORDENACOES) {
  return [...produtos].sort(ORDENACOES[criterio]);
}

Um novo critério é uma linha no mapa. O sort não muda, e o [...produtos] evita alterar a lista original.

Em resumo

Referências

Continue aprendendo

Todos os temas de boas práticas e padrões →