представлять
Цепочка ответственности заключается в том, чтобы дать возможность нескольким объектам иметь возможность обработать запрос, тем самым избегая взаимосвязи связывания между отправителем и получателем запроса. Подключите объект в цепь и передайте запрос вдоль цепи, пока объект не обратится к нему.
То есть после запроса, начиная с первого объекта, объект, получающий запрос в цепочке, либо обрабатывает его лично, либо перенаправляет его к следующему кандидату в цепочке. Предоставление объекта. В зависимости от времени выполнения, любой кандидат может ответить на соответствующий запрос. Количество кандидатов произвольно. Вы можете решить, какие кандидаты участвуют в сети во время выполнения.
текст
Для реализаций JavaScript мы можем использовать его функции прототипа для реализации шаблона цепочки ответственности.
Кода -копия выглядит следующим образом:
var no_topic = -1;
var Тема;
обработчик функций (s, t) {
this.successor = s || нулевой;
this.topic = t || 0;
}
Handler.prototype = {
handle: function () {
if (this.successor) {
this.successor.handle ()
}
},
есть: function () {
вернуть это.topic! = no_topic;
}
};
Обработчик просто принимает 2 параметра. Первым является преемник (используемый для передачи запроса на обработку), а вторым является уровень прохождения (который можно использовать для управления, выполнять ли операцию на определенном уровне или нет). Прототип обработчика раскрывает метод шкафы, который является ключом к реализации этого шаблона. Давайте сначала посмотрим, как использовать приведенный выше код.
Кода -копия выглядит следующим образом:
var app = new Handler ({
handle: function () {
console.log ('handle');
}
}, 3);
var dialog = new Handler (App, 1);
var button = new Handler (диалог, 2);
button.handle ();
Измените код через функцию прототипа и вызовите код из кнопки. Первые три - это все ручки, которые называют прототипом. Наконец, ручка в падебном параметре обнаруживается, а затем результат будет выходить, что означает, что обрабатывается только последний слой.
Так как же я могу позволить диалоговому объекту только обработать при вызове? На самом деле, вы можете определить метод грандиозного элемента объекта экземпляра диалога, но его необходимо сделать до новой кнопки. Код заключается в следующем:
Кода -копия выглядит следующим образом:
var app = new Handler ({
handle: function () {
console.log ('handle');
}
}, 3);
var dialog = new Handler (App, 1);
dialog.handle = function () {
console.log ('диалог раньше ...')
// вот конкретные операции обработки
console.log ('диалог после ...')
};
var button = new Handler (диалог, 2);
button.handle ();
Результатом выполнения этого кода является результат процесса в диалоге. Использование и больше не является операцией выполнения дескриптора, определенной в параметрах, передаваемых в приложение.
Итак, можем ли мы сделать это через процесс преемника, а затем позволить преемнику продолжать справляться с этим? Ответ - да, но после вызова ручки вам необходимо использовать характеристики прототипа, чтобы вызвать следующий код:
Кода -копия выглядит следующим образом:
Handler.prototype.handle.call (это);
Значение этого предложения состоит в том, чтобы вызвать метод прототипа ручки, чтобы продолжить вызов методу ручки его преемника (то есть преемника). Следующий код выражается как: будут выполнены ручки, определенные тремя объектами кнопки/диалога/приложения.
Кода -копия выглядит следующим образом:
var app = new Handler ({
handle: function () {
console.log ('handle');
}
}, 3);
var dialog = new Handler (App, 1);
dialog.handle = function () {
console.log ('диалог раньше ...')
// вот конкретные операции обработки
Handler.prototype.handle.call (это); // продолжать подниматься
console.log ('диалог после ...')
};
var button = new Handler (диалог, 2);
button.handle = function () {
console.log ('кнопка до ...')
// вот конкретные операции обработки
Handler.prototype.handle.call (это);
console.log ('кнопка после ...')
};
button.handle ();
Благодаря выполнению результатов кода, мы видим, что если вы хотите сначала обработать его самостоятельно, а затем позвонить преемнику для его обработки, выполните Handler.prototype.handle.call (это); код в конце. Если вы хотите сначала обработать код преемника, выполните Handler.prototype.handle.call (this); код в начале.
Суммировать
Цепочка обязанностей часто используется с помощью комбинации, так что родительский компонент компонента может служить его преемником.
В то же время механизм пузырьков событий в DOM, кажется, немного похож на это. Например, после нажатия кнопки, если пузырь не предотвращен, событие Click всегда будет пузыриться к родительскому элементу. Этот механизм также может использоваться для решения многих связанных проблем, таких как пример кода «Пример 1: Централизованное управление событиями» в шаблоне проектирования этой серии.