Chain of Responsibility – fluxuri de procesare în lanț
Î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