Chain of Responsibility

14. März 2020

Es dient der Entkopplung des Auslösers einer Anfrage mit seinem Empfänger. Mehrere Objekte werden hintereinander geschaltet (miteinander verkettet), um gemeinsam eine eingehende Anfrage bearbeiten zu können. Diese Anfrage wird an der Kette entlang geleitet, bis eines der Objekte die Anfrage beantworten kann. Der Klient, von dem die Anfrage ausgeht, hat dabei keine Kenntnis darüber, von welchem Objekt die Anfrage beantwortet werden wird.

https://de.wikipedia.org/wiki/Zuständigkeitskette
public abstract class Logger
{
    private Logger _NextLogger;

    public virtual void Log(string message)
    {
        _NextLogger?.Log(message);
    }

    public Logger SetNext(Logger logger)
    {
        var lastLogger = this;

        while (lastLogger._NextLogger != null)
        {
            lastLogger = lastLogger._NextLogger;
        }

        lastLogger._NextLogger = logger;
        return this;
    }
}

public class ConsoleLogger : Logger
{
    public override void Log(string message)
    {
        //TODO
        base.Log(message);
    }
}

public class EventLogger : Logger
{
    public override void Log(string message)
    {
        //TODO
        base.Log(message);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var logger = new ConsoleLogger()
            .SetNext(new EventLogger());

        logger.Log("Test");
    }
}