소개하다
책임의 체인은 여러 객체가 요청을 처리 할 수있는 기회를 가질 수 있도록하여 송신자와 요청의 수신자 간의 커플 링 관계를 피하는 것입니다. 객체를 체인에 연결하고 객체가 처리 할 때까지 체인을 따라 요청을 전달하십시오.
즉, 첫 번째 객체에서 시작하여 요청 후 체인에서 요청을 수신하는 객체는 개인적으로 처리하거나 체인의 다음 후보에게 전달합니다. 요청을 제출하는 객체는 어떤 객체를 처리 할 것인지 정확히 알지 못합니다. 즉, 요청에는 암시 적 수신기가 있습니다. 런타임에 따라 모든 후보자는 해당 요청에 응답 할 수 있습니다. 후보자 수는 임의적입니다. 런 타임에 어떤 후보자가 체인에 참여하는지 결정할 수 있습니다.
텍스트
JavaScript 구현의 경우 프로토 타입 기능을 사용하여 책임 체인 패턴을 구현할 수 있습니다.
코드 사본은 다음과 같습니다.
var no_topic = -1;
var 주제;
함수 처리기 (s, t) {
this.successor = s || 널;
this.topic = t || 0;
}
handler.prototype = {
핸들 : function () {
if (this.successor) {
this.successor.handle ()
}
},
HOS : function () {
this.topic! = no_topic;
}
};
핸들러는 2 개의 매개 변수를 허용합니다. 첫 번째는 후임자 (처리 요청을 통과하는 데 사용됨)이고, 두 번째는 통과 레벨 (특정 수준에서 작업을 수행할지 여부를 제어하는 데 사용할 수 있음)입니다. 핸들러 프로토 타입은 핸들 방법을 노출 시키는데, 이는이 패턴을 구현하는 핵심입니다. 먼저 위의 코드를 사용하는 방법을 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
var app = 새 핸들러 ({
핸들 : function () {
Console.log ( '앱 핸들');
}
}, 3);
var 대화 상자 = 새 핸들러 (App, 1);
var button = 새 핸들러 (대화, 2);
button.handle ();
프로토 타입 기능을 통해 코드를 변경하고 button.handle ()-> dialog.handle ()-> app.handle ()-> 매개 변수 핸들 ()에서 코드를 호출하십시오. 처음 세 가지는 프로토 타입을 호출하는 모든 핸들입니다. 마지막으로, 전달 된 매개 변수의 핸들이 발견되고 결과는 출력이므로 마지막 레이어 만 처리됩니다.
전화 할 때 대화 상자 개체를 어떻게 처리하도록하려면 어떻게해야합니까? 실제로 대화 상자 인스턴스 객체의 핸들 메소드를 정의 할 수 있지만 새 버튼 전에 수행해야합니다. 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
var app = 새 핸들러 ({
핸들 : function () {
Console.log ( '앱 핸들');
}
}, 3);
var 대화 상자 = 새 핸들러 (App, 1);
dialog.handle = function () {
Console.log ( '이전 대화 ...')
// 특정 처리 작업은 다음과 같습니다
console.log ( '대화 후 ...')
};
var button = 새 핸들러 (대화, 2);
button.handle ();
이 코드의 실행 결과는 대화 상자에서 프로세스 결과이며 핸들이 더 이상 앱에 전달 된 매개 변수에 정의 된 핸들의 실행 작업이 아닙니다.
그래서 우리는 후임자의 과정을 통해 그것을 만들고 후임자가 계속 그것을 처리하게 할 수 있습니까? 대답은 예이지만 핸들을 호출 한 후 프로토 타입의 특성을 사용하여 다음 코드를 호출해야합니다.
코드 사본은 다음과 같습니다.
handler.prototype.handle.call (this);
이 문장의 의미는 프로토 타입 핸들 메소드를 호출하여 후임자 (즉, 후계자)의 핸들 방법을 계속 호출하는 것입니다. 다음 코드는 다음과 같이 표현됩니다. 버튼/대화/앱의 세 객체로 정의 된 핸들이 실행됩니다.
코드 사본은 다음과 같습니다.
var app = 새 핸들러 ({
핸들 : function () {
Console.log ( '앱 핸들');
}
}, 3);
var 대화 상자 = 새 핸들러 (App, 1);
dialog.handle = function () {
Console.log ( '이전 대화 ...')
// 특정 처리 작업은 다음과 같습니다
handler.prototype.handle.call (this); // 계속 올라갑니다
console.log ( '대화 후 ...')
};
var button = 새 핸들러 (대화, 2);
button.handle = function () {
Console.log ( '이전 버튼 ...')
// 특정 처리 작업은 다음과 같습니다
handler.prototype.handle.call (this);
Console.log ( '버튼 이후 ...')
};
button.handle ();
코드의 실행 결과를 통해 코드의 실행 결과를 통해 먼저 직접 처리 한 다음 후임자에게 전화하여 처리하려면 handler.prototype.handle.call (this)을 실행하십시오. 마지막에 코드. 후속 코드를 먼저 처리하려면 handler.prototype.handle.call (this)을 실행하십시오. 처음에 코드.
요약
책임의 사슬은 종종 조합 패턴과 함께 사용되므로 구성 요소의 부모 구성 요소가 후속자가 될 수 있습니다.
동시에, DOM의 이벤트 버블 메커니즘은 이것과 약간 비슷한 것으로 보인다. 예를 들어, 버튼을 클릭 한 후 버블을 방지하지 않으면 클릭 이벤트가 항상 부모 요소를 향해 기포됩니다. 이 메커니즘은 또한이 시리즈의 설계 패턴에서 "예제 1 : 중앙 집중식 이벤트 관리"의 예 코드와 같은 많은 관련 문제를 처리하는 데 사용될 수 있습니다.