Template Method
O Template Method define a estrutura geral de um algoritmo em uma classe base, deixando algumas etapas para as subclasses implementarem.
A ideia é:
Definir o esqueleto de um algoritmo, permitindo que subclasses personalizem determinadas etapas.
Imagine o processamento de arquivos:
Ler arquivo
↓
Processar dados
↓
Salvar resultado
O fluxo é sempre o mesmo, mas o processamento pode mudar.
Classe base
abstract class DataProcessor {
process() {
this.read();
this.processData();
this.save();
}
abstract read(): void;
abstract processData(): void;
abstract save(): void;
}
A classe define a ordem:
read()
↓
processData()
↓
save()
As subclasses implementam os detalhes.
Processador CSV
class CsvProcessor
extends DataProcessor {
read() {
console.log(
"Lendo CSV"
);
}
processData() {
console.log(
"Processando CSV"
);
}
save() {
console.log(
"Salvando resultado CSV"
);
}
}
Processador JSON:
class JsonProcessor
extends DataProcessor {
read() {
console.log(
"Lendo JSON"
);
}
processData() {
console.log(
"Processando JSON"
);
}
save() {
console.log(
"Salvando resultado JSON"
);
}
}
Uso:
const processor =
new CsvProcessor();
processor.process();
O fluxo será:
Lendo CSV
↓
Processando CSV
↓
Salvando resultado CSV
O fluxo principal não pode ser alterado pela subclasse.
Exemplo prático
Imagine um sistema de importação:
Importar dados
↓
Validar
↓
Transformar
↓
Salvar
↓
Notificar
O processo é sempre igual, mas podemos ter:
CSV Importer
JSON Importer
XML Importer
Excel Importer
Cada implementação muda apenas as etapas necessárias.
Hook
Uma característica comum do Template Method são os hooks.
Um hook é um método que pode ser sobrescrito opcionalmente.
abstract class DataProcessor {
process() {
this.read();
this.processData();
if (
this.shouldNotify()
) {
this.notify();
}
}
abstract read(): void;
abstract processData(): void;
shouldNotify() {
return true;
}
notify() {
console.log(
"Notificando"
);
}
}
Uma subclasse pode alterar:
shouldNotify() {
return false;
}
Assim, ela mantém o algoritmo geral, mas modifica uma parte opcional.
Template Method vs Strategy
Os dois padrões ajudam a variar algoritmos, mas de maneiras diferentes.
Template Method:
Herança
↓
Classe base define o fluxo
↓
Subclasses implementam etapas
Strategy:
Composição
↓
Objeto recebe um algoritmo
↓
Algoritmo pode ser trocado
Template Method utiliza principalmente herança.
Strategy utiliza principalmente composição.
Quando usar?
Template Method é útil quando:
- Várias classes seguem o mesmo fluxo.
- Algumas etapas variam.
- Queremos garantir uma ordem fixa de execução.
- Existe código duplicado entre algoritmos semelhantes.
A ideia principal é:
Definir o fluxo geral de um algoritmo na classe base e permitir que subclasses personalizem etapas específicas.