Exemplo

Implementação do Design Pattern Chain of Responsibility: Exemplificando um sistema de restaurante, onde há um elo entre cada etapa do atendimento, sendo cada operação executada em ordem.

Você pode testar o exemplo aqui.


IHandler.cs

public interface IHandler
{
    void HandleRequest(Pedido pedido);

    void SetNext(IHandler handler);

    bool BreakChain();
}

public abstract class BaseHandler : IHandler
{
    protected IHandler _next { get; set; }

    public abstract void HandleRequest(Pedido pedido);

    public void SetNext(IHandler handler)
    {
        _next = handler;
    }

    public void NextHandleRequest(Pedido pedido)
    {
        if (_next != null) _next.HandleRequest(pedido);
    }

    public bool BreakChain()
    {
        _next = null;
        return true;
    }
}

Handlers.cs

using System;

public class AtenderClienteHandler : BaseHandler
{
    public override void HandleRequest(Pedido pedido)
    {
        Console.WriteLine("Garçom atendeu o cliente.");
        NextHandleRequest(pedido);
    }
}

public class ReceberPedidoHandler : BaseHandler
{
    public override void HandleRequest(Pedido pedido)
    {
        Console.WriteLine($"Garçom recebeu o pedido: {pedido.Descricao}.");
        NextHandleRequest(pedido);
    }
}

public class PrepararPedidoHandler : BaseHandler
{
    public override void HandleRequest(Pedido pedido)
    {        
        Console.WriteLine($"Cozinha preparou o pedido: {pedido.Descricao}.");
        
        // Simulando quebra da corrente ⛓️
        //
        // if (BreakChain())
        // {
        //     Console.WriteLine($"Não foi possível preparar o pedido. Encerrando atendimento.");
        // }
        //
        // Fim

        NextHandleRequest(pedido);
    }
}

public class EntregarPedidoHandler : BaseHandler
{
    public override void HandleRequest(Pedido pedido)
    {
        Console.WriteLine($"Pedido entregue ao cliente: {pedido.Descricao}.");
        NextHandleRequest(pedido);
    }
}

Program.cs

using System;

public class Pedido
{
    public String Descricao { get; set; }
}

class Program
{
    static void Main()
    {
        var pedido = new Pedido { Descricao = "Pizza Margherita" };

        var atenderCliente = new AtenderClienteHandler();
        var receberPedido = new ReceberPedidoHandler();
        var prepararPedido = new PrepararPedidoHandler();
        var entregarPedido = new EntregarPedidoHandler();

        atenderCliente.SetNext(receberPedido);
        receberPedido.SetNext(prepararPedido);
        prepararPedido.SetNext(entregarPedido);

        atenderCliente.HandleRequest(pedido);
    }
}

Figura 4. Captura de tela da saída do programa.

Como já mencionado, você pode testar o exemplo aqui.

Last updated