Tutorials Design Patterns in C#
Chain of Responsibility Pattern — Complete Guide
Chain of Responsibility Pattern — Complete Guide: free step-by-step lesson with examples, common mistakes, and interview tips — part of Design Patterns in C# on Toolliyo Academy.
On this page
Design Patterns in C# · Lesson 13 of 69
Chain of Responsibility Pattern
GoF Core ✓ → Enterprise → Cloud & Craft
Enterprise · 2 — App patterns · ~6 min · Module 3: Behavioral Design Patterns
What is this?
Chain of Responsibility passes a request along handlers until one handles it — each handler decides to process or forward.
Why should you care?
ShopNest order validation (stock → fraud → coupon) should be a pipeline you can reorder without nested ifs.
See it live — copy this example
Paste into a C# console or class library project and run dotnet run.
public abstract class OrderHandler
{
protected OrderHandler? Next;
public OrderHandler SetNext(OrderHandler n) { Next = n; return n; }
public void Handle(OrderCtx ctx)
{
if (!Process(ctx)) return;
Next?.Handle(ctx);
}
protected abstract bool Process(OrderCtx ctx);
}
public sealed record OrderCtx(string Sku, decimal Amount, List<string> Errors);
public sealed class StockHandler : OrderHandler
{
protected override bool Process(OrderCtx ctx)
{
if (ctx.Sku == "BAD") { ctx.Errors.Add("out of stock"); return false; }
return true;
}
}
public sealed class FraudHandler : OrderHandler
{
protected override bool Process(OrderCtx ctx)
{
if (ctx.Amount > 100000) { ctx.Errors.Add("fraud hold"); return false; }
return true;
}
}
var ctx = new OrderCtx("HD-100", 4999, new());
var stock = new StockHandler();
stock.SetNext(new FraudHandler());
stock.Handle(ctx);
Console.WriteLine(ctx.Errors.Count == 0 ? "ok" : string.Join(",", ctx.Errors));
Run Example »
Edit the code below and click Run to see the result in Toolliyo’s live editor.
What happened?
- Stock runs first; on failure it stops the chain.
- Fraud runs only if stock passes.
- ASP.NET middleware is the same idea at HTTP level.
Practice next
- Run happy path and a BAD sku.
- Reorder handlers.
- Add CouponHandler.
- Make Process async Task
. - Collect warnings without stopping.
Remember
Pipeline of handlers. Stop or forward. Easy to extend.
ShopNest place-order checks
Stock → fraud → coupon chain before payment.
Outcome: New checks plug in as another handler.
Interview prep for this lesson
Practice these questions aloud after reading—each links to a full structured answer.
Sign in to ask a question or upvote helpful answers.
No questions yet — be the first to ask!