using System.Collections.Generic;
public static void Main()
var monkey = new MonkeyHandler();
var squirrel = new SquirrelHandler();
var dog = new DogHandler();
monkey.SetNext(squirrel).SetNext(dog);
Console.WriteLine("Chain: Monkey > Squirrel > Dog\n");
Client.ClientCode(monkey);
Console.WriteLine("Subchain: Squirrel > Dog\n");
Client.ClientCode(squirrel);
public static void ClientCode(AbstractHandler handler)
foreach(var food in new List<string> {"Nut", "Banana", "MeatBall"})
Console.WriteLine($"Client: Who wants a {food}");
var result = handler.Handle(food);
Console.WriteLine($"{result}");
Console.WriteLine($"{food} was left un touched.");
public interface IHandler
IHandler SetNext(IHandler handler);
object Handle(object request);
public abstract class AbstractHandler : IHandler
private IHandler _nextHandler;
public IHandler SetNext(IHandler handler)
this._nextHandler = handler;
public virtual object Handle(object request)
if(this._nextHandler != null)
return this._nextHandler.Handle(request);
public class MonkeyHandler : AbstractHandler
public override object Handle(object request)
if((request as string) == "Banana")
return $"Monkey eat: {request.ToString()}";
return base.Handle(request);
public class SquirrelHandler : AbstractHandler
public override object Handle(object request)
if((request as string) == "Nut")
return $"Squirrel eat: {request.ToString()}";
return base.Handle(request);
public class DogHandler : AbstractHandler
public override object Handle(object request)
if((request as string) == "MeatBall")
return $"Dog eat: {request.ToString()}";
return base.Handle(request);