Strategy × Template Method

Dois padrões que costumam ser trocados um pelo outro, e o que de fato os separa.

Em uma frase

Ambos isolam a parte que varia de um algoritmo. Strategy varia por composição, trocável em tempo de execução; Template Method varia por herança, fixado em tempo de compilação.

Critério a critério

  • Como a variação entra?

    Strategy
    Um objeto injetado — você troca a estratégia quando quiser.
    Template Method
    Uma subclasse que preenche os passos abertos pela base.
  • Quem controla o fluxo?

    Strategy
    O contexto chama a estratégia e faz o resto.
    Template Method
    A classe base: ela chama a subclasse nos momentos certos.
  • Dá para mudar depois de criado?

    Strategy
    Sim, o objeto pode trocar de comportamento em pleno voo.
    Template Method
    Não. A escolha ficou selada na hora da instanciação.
  • E se houver duas dimensões de variação?

    Strategy
    Duas famílias de estratégias independentes, injetadas em separado.
    Template Method
    A hierarquia explode em subclasses cruzadas.
  • Quanto custa uma variação nova?

    Strategy
    Uma classe (ou uma função) que implementa a interface.
    Template Method
    Uma subclasse — mais barata quando as variações são poucas e estáveis.

Quando escolher cada um

Strategy

As variações se combinam, mudam com frequência ou precisam trocar em tempo de execução.

Ver o conceito completo

Template Method

A sequência é a invariante que você quer proteger, e as variações são poucas e estáveis.

Ver o conceito completo

Por que confundem

Os dois resolvem 'este trecho muda, o resto não', então parecem intercambiáveis. Não são: a pergunta é se a variação precisa ser escolhida depois que o objeto existe. Se precisar, herança não serve — e Template Method ainda consome a única herança disponível em linguagens sem herança múltipla.