public string Username {get; set;}
public string Password {get; set;}
public abstract class Handler
public Handler(Handler next)
protected abstract bool DoHandle(HttpRequest request);
public void Handle(HttpRequest request) {
public class Authenticator: Handler
public Authenticator(Handler handler): base(handler)
protected override bool DoHandle(HttpRequest request)
Console.WriteLine("Authenticating request");
return !(request.Username == "admin" && request.Password == "1234");
public class Logger: Handler
public Logger(Handler handler): base(handler)
protected override bool DoHandle(HttpRequest request)
Console.WriteLine("Logging request");
public class Compressor: Handler
public Compressor(Handler handler): base(handler)
protected override bool DoHandle(HttpRequest request)
Console.WriteLine("Compressing request");
public WebServer(Handler handler)
public void Handle(HttpRequest request) {
public static void Main()
var logger = new Logger(null);
var compressor = new Compressor(logger);
var authenticator = new Authenticator(compressor);
var webserver = new WebServer(authenticator);
webserver.Handle(new HttpRequest(){Username = "admin", Password = "1234"});