DEV Community

Juarez Júnior for Develop4Us

Posted on • Edited on

C# Design Pattern: Template Method (Portugues)

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();
    }
}
Enter fullscreen mode Exit fullscreen mode

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)