Javascript. Chain of responsibility pattern

Паттерн Цепочка обязанностей (Chain of responsibility pattern) используется, когда вы хотите предоставить нескольким объектам возможность обработать запрос. То есть предназначен для организации в системе уровней ответственности. В паттерне создается цепочка объектов, последовательно анализирующих запрос. Каждый объект получает запрос и либо обрабатывает его, либо передает следующему объекту в цепочке. Данный шаблон относится к поведенческим шаблонам.

Ниже приведен очередной пример реализации паттерна на основе системы логирования определенных сообщений. Типу сообщения соответствует свой логер. Логеры составляют цепочку объектов-обработчиков поступающих сообщений.

var Logger = (function () {

    var Logger = function () {
    
        var next = null;
    
        this.setNext = function (log) {
            next = log;
            return log;
        };
        
        this.message = function (msg, priority) {
            if (priority <= this.mask) {
                this.writeMessage(msg);
            }
            if (next !== null) {
                next.message(msg, priority);
            }
        };

        // abstract protected writeMessage(msg)
    
    };
    
    Logger.ERR = 3;
    Logger.NOTICE = 5;
    Logger.DEBUG = 7;
    
    return Logger;
})();

var StdOutLogger = function (mask) {
    this.mask = mask;
    this.writeMessage = function (msg) {
        console.log("Writing to stdout: " + msg);
    };
};

StdOutLogger.prototype = new Logger();
StdOutLogger.prototype.constructor = StdOutLogger;

var EmailLogger = function (mask) {
    this.mask = mask;
    this.writeMessage = function (msg) {
        console.log("Sending via email: " + msg);
    };
};

EmailLogger.prototype = new Logger();
EmailLogger.prototype.constructor = EmailLogger;

var StdErrLogger = function (mask) {
    this.mask = mask;
    this.writeMessage = function (msg) {
        console.log("Sending to stderr: " + msg);
    };
};

StdErrLogger.prototype = new Logger();
StdErrLogger.prototype.constructor = StdErrLogger;

// testing...

var Application = function () {
    this.run = function () {    
        var logger, logger1, logger2;
        
        logger = new StdOutLogger(Logger.DEBUG);
        logger1 = logger.setNext(new EmailLogger(Logger.NOTICE));
        logger2 = logger1.setNext(new StdErrLogger(Logger.ERR));
        
        logger.message("Entering function y.", Logger.DEBUG);
        logger.message("Step1 completed.", Logger.NOTICE);
        logger.message("An error has occurred.", Logger.ERR);    
    };
};

var application = new Application();
application.run();

На выходе

Writing to stdout: Entering function y.
Writing to stdout: Step1 completed.
Sending via email: Step1 completed.
Writing to stdout: An error has occurred.
Sending via email: An error has occurred.
Sending to stderr: An error has occurred.