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.
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;
}
}
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);
}
}
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);
}
}

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