Chain of Responsibility – fluxuri de procesare în lanț

  • Doru Bulubasa
  • 10 December 2025

În arhitectura software, Chain of Responsibility (CoR) este un pattern comportamental care îți permite să procesezi cereri printr-un lanț de handleri, fără ca expeditorul să știe care obiect o va trata. Fiecare handler decide: procesează cererea sau o pasează mai departe.

Este un pattern excelent pentru:

  • validări succesive

  • middleware-uri

  • procesarea mesajelor

  • pipeline-uri

  • aprobări în fluxuri enterprise


Conceptul din spatele Chain of Responsibility

Ideea este simplă: ai o serie de obiecte, fiecare cu responsabilitatea lui. Când o cerere intră în lanț, fiecare handler verifică dacă poate să o proceseze. Dacă nu, o trimite mai departe.

Avantaje:

  • decuplare totală între emitent și procesor

  • flexibilitate în modificarea lanțului

  • adăugare ușoară de noi pași în flux


Exemplu în C# (.NET)

Vom construi un lanț de validări pentru un request simplu.

1. Definim abstract Handler-ul

public abstract class Handler
{
    private Handler _next;

    public Handler SetNext(Handler next)
    {
        _next = next;
        return next;
    }

    public virtual void Handle(Request request)
    {
        if (_next != null)
            _next.Handle(request);
    }
}


2. Creăm handler-ele concrete

public class AuthHandler : Handler
{
    public override void Handle(Request request)
    {
        if (!request.IsAuthenticated)
            throw new Exception("User not authenticated!");

        Console.WriteLine("Auth OK");
        base.Handle(request);
    }
}

public class ValidationHandler : Handler
{
    public override void Handle(Request request)
    {
        if (string.IsNullOrWhiteSpace(request.Data))
            throw new Exception("Invalid data!");

        Console.WriteLine("Validation OK");
        base.Handle(request);
    }
}

public class LoggingHandler : Handler
{
    public override void Handle(Request request)
    {
        Console.WriteLine("Logged request");
        base.Handle(request);
    }
}


3. Clasa Request

public class Request
{
    public bool IsAuthenticated { get; set; }
    public string Data { get; set; }
}


4. Configurăm lanțul

var request = new Request
{
    IsAuthenticated = true,
    Data = "Hello!"
};

var handler = new AuthHandler();
handler
    .SetNext(new ValidationHandler())
    .SetNext(new LoggingHandler());

handler.Handle(request);


Ce obținem?

Executarea fluxului:

Auth OK
Validation OK
Logged request

Când folosim Chain of Responsibility în .NET?

✔ Pipelines în ASP.NET Core (middleware-uri)

✔ Validări multiple la trimiterea unui formular

✔ Mesaje procesate secvențial în queue-uri

✔ Fluxuri de aprobare (aprobator → manager → director)

✔ Orice sistem unde pașii trebuie să fie decuplați

Scrie un comentariu

Adresa de mail nu va fi publicata. Campurile obligatorii sunt marcate cu *