C# Design Pattern: Chain of Responsibility (Portugues)

Juarez Júnior - Oct 6 - - Dev Community

O padrão Chain of Responsibility (Cadeia de Responsabilidade) é usado para passar uma solicitação ao longo de uma cadeia de manipuladores. Cada manipulador decide se trata a solicitação ou se a passa adiante. É útil quando você tem várias etapas ou responsabilidades que podem processar uma solicitação, como em um sistema de aprovação de despesas, onde diferentes níveis de gerentes podem aprovar diferentes valores.

Exemplo de Código em C#:



// Classe base para manipuladores
public abstract class Aprovador
{
    protected Aprovador _sucessor;

    public void DefinirSucessor(Aprovador sucessor)
    {
        _sucessor = sucessor;
    }

    public abstract void ProcessarPedido(int valor);
}

// Aprovador nível baixo (pode aprovar até 1000)
public class Gerente : Aprovador
{
    public override void ProcessarPedido(int valor)
    {
        if (valor <= 1000)
        {
            Console.WriteLine($"Gerente aprovou a solicitação de {valor} reais.");
        }
        else if (_sucessor != null)
        {
            _sucessor.ProcessarPedido(valor);
        }
    }
}

// Aprovador nível médio (pode aprovar até 5000)
public class Diretor : Aprovador
{
    public override void ProcessarPedido(int valor)
    {
        if (valor <= 5000)
        {
            Console.WriteLine($"Diretor aprovou a solicitação de {valor} reais.");
        }
        else if (_sucessor != null)
        {
            _sucessor.ProcessarPedido(valor);
        }
    }
}

// Aprovador nível alto (pode aprovar qualquer valor)
public class Presidente : Aprovador
{
    public override void ProcessarPedido(int valor)
    {
        Console.WriteLine($"Presidente aprovou a solicitação de {valor} reais.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Criando a cadeia de responsabilidade
        Aprovador gerente = new Gerente();
        Aprovador diretor = new Diretor();
        Aprovador presidente = new Presidente();

        gerente.DefinirSucessor(diretor);
        diretor.DefinirSucessor(presidente);

        // Testando a cadeia com diferentes valores
        gerente.ProcessarPedido(500);   // Gerente aprova
        gerente.ProcessarPedido(3000);  // Diretor aprova
        gerente.ProcessarPedido(10000); // Presidente aprova
    }
}


Enter fullscreen mode Exit fullscreen mode

Explicação do Código:

Neste exemplo, temos três classes de aprovadores: Gerente, Diretor e Presidente. Cada um tem um limite de aprovação. Se o valor for maior do que o limite, a solicitação é passada para o próximo aprovador na cadeia. O Gerente pode aprovar até 1000 reais, o Diretor até 5000, e o Presidente aprova qualquer valor.

Conclusão:

O padrão Chain of Responsibility permite que diferentes objetos tentem processar uma solicitação. Ele é útil para sistemas onde várias etapas ou níveis hierárquicos precisam processar pedidos ou tomar decisões. A solicitação é passada até que alguém possa lidar com ela.

Código fonte: GitHub

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player