Паттерн Цепочка обязанностей (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.