O padrão Template Method define o esqueleto de um algoritmo em uma classe base, permitindo que subclasses implementem partes específicas do algoritmo. Ele é útil quando você tem um algoritmo que segue uma estrutura básica, mas algumas partes podem variar dependendo da implementação específica. Isso permite que o código compartilhado seja reutilizado enquanto ainda se fornece flexibilidade para as subclasses.
Exemplo de Código em C#:
// Classe abstrata que define o Template Method
public abstract class PrepararBebida
{
// Método Template: define os passos do algoritmo
public void Preparar()
{
FerverAgua();
AdicionarIngredientePrincipal();
Servir();
if (AdicionarCondimentosDesejados())
{
AdicionarCondimentos();
}
}
// Passos comuns
private void FerverAgua()
{
Console.WriteLine("Fervendo água...");
}
private void Servir()
{
Console.WriteLine("Servindo a bebida...");
}
// Passos que serão implementados pelas subclasses
protected abstract void AdicionarIngredientePrincipal();
protected abstract void AdicionarCondimentos();
// Hook method para condimentos opcionais
protected virtual bool AdicionarCondimentosDesejados()
{
return true;
}
}
// Subclasse para preparar café
public class PrepararCafe : PrepararBebida
{
protected override void AdicionarIngredientePrincipal()
{
Console.WriteLine("Adicionando pó de café.");
}
protected override void AdicionarCondimentos()
{
Console.WriteLine("Adicionando açúcar e leite.");
}
}
// Subclasse para preparar chá
public class PrepararCha : PrepararBebida
{
protected override void AdicionarIngredientePrincipal()
{
Console.WriteLine("Adicionando o saquinho de chá.");
}
protected override void AdicionarCondimentos()
{
Console.WriteLine("Adicionando limão.");
}
protected override bool AdicionarCondimentosDesejados()
{
return false; // Não adicionar condimentos
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Preparando Café:");
PrepararBebida cafe = new PrepararCafe();
cafe.Preparar();
Console.WriteLine("\nPreparando Chá:");
PrepararBebida cha = new PrepararCha();
cha.Preparar();
}
}
Explicação do Código:
Neste exemplo, a classe PrepararBebida define o método Preparar, que é o template para preparar uma bebida. Ele segue a mesma sequência de passos (ferver água, adicionar o ingrediente principal, servir, e opcionalmente adicionar condimentos). As subclasses PrepararCafe e PrepararCha implementam os detalhes específicos de como preparar café e chá, respectivamente. O método AdicionarCondimentosDesejados é um hook que permite às subclasses decidir se condimentos serão adicionados ou não.
Conclusão:
O padrão Template Method é útil quando você tem um algoritmo que segue uma estrutura básica, mas deseja permitir que subclasses modifiquem partes específicas desse algoritmo. Isso ajuda a reutilizar código comum e manter o código especializado separado.
Código fonte: GitHub
Top comments (0)