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 completoTemplate Method
A sequência é a invariante que você quer proteger, e as variações são poucas e estáveis.
Ver o conceito completoPor 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.