แนะนำ
ห่วงโซ่แห่งความรับผิดชอบคือการเปิดใช้งานวัตถุหลายชิ้นเพื่อให้มีโอกาสประมวลผลคำขอดังนั้นจึงหลีกเลี่ยงความสัมพันธ์ระหว่างผู้ส่งและผู้รับการร้องขอ เชื่อมต่อวัตถุเข้ากับโซ่และส่งคำขอไปตามห่วงโซ่จนกว่าวัตถุจะจัดการกับมัน
นั่นคือหลังจากการร้องขอเริ่มต้นจากวัตถุแรกวัตถุที่ได้รับคำขอในห่วงโซ่จะจัดการมันเป็นการส่วนตัวหรือส่งต่อไปยังผู้สมัครคนต่อไปในห่วงโซ่ วัตถุที่ส่งคำขอไม่ทราบว่าวัตถุใดจะจัดการได้ - นั่นคือคำขอมีตัวรับสัญญาณโดยนัย ขึ้นอยู่กับเวลาทำงานผู้สมัครใด ๆ สามารถตอบสนองต่อคำขอที่เกี่ยวข้อง จำนวนผู้สมัครเป็นไปโดยพลการ คุณสามารถตัดสินใจได้ว่าผู้สมัครคนใดมีส่วนร่วมในห่วงโซ่ในเวลาทำงาน
ข้อความ
สำหรับการใช้งาน JavaScript เราสามารถใช้คุณสมบัติต้นแบบเพื่อใช้รูปแบบห่วงโซ่ความรับผิดชอบ
การคัดลอกรหัสมีดังนี้:
var no_topic = -1;
หัวข้อ var;
ฟังก์ชั่นตัวจัดการ (s, t) {
this.successor = s || โมฆะ;
this.topic = t || 0;
-
handler.prototype = {
มือจับ: ฟังก์ชั่น () {
if (this.successor) {
this.successor.handle ()
-
-
มี: function () {
ส่งคืนสิ่งนี้ topic! = no_topic;
-
-
ตัวจัดการเพิ่งยอมรับพารามิเตอร์ 2 ตัว อย่างแรกคือผู้สืบทอด (ใช้เพื่อส่งคำขอการประมวลผลลง) และที่สองคือระดับการผ่าน (ซึ่งสามารถใช้เพื่อควบคุมว่าจะทำการดำเนินการในระดับหนึ่งหรือไม่) ต้นแบบตัวจัดการเปิดเผยวิธีการจัดการซึ่งเป็นกุญแจสำคัญในการใช้รูปแบบนี้ ก่อนอื่นลองดูวิธีใช้รหัสด้านบน
การคัดลอกรหัสมีดังนี้:
var app = handler ใหม่ ({
มือจับ: ฟังก์ชั่น () {
console.log ('App Handle');
-
}, 3);
กล่องโต้ตอบ var = ตัวจัดการใหม่ (แอพ, 1);
ปุ่ม var = ตัวจัดการใหม่ (กล่องโต้ตอบ, 2);
button.handle ();
เปลี่ยนรหัสผ่านคุณสมบัติต้นแบบและเรียกรหัสจาก button.handle ()-> dialog.handle ()-> app.handle ()-> handle พารามิเตอร์ () สามคนแรกเป็นที่จับทั้งหมดที่เรียกต้นแบบ ในที่สุดจะพบที่จับในพารามิเตอร์ที่ส่งผ่านและจากนั้นผลลัพธ์คือเอาต์พุตซึ่งหมายความว่าเฉพาะเลเยอร์สุดท้ายเท่านั้นที่ถูกประมวลผล
ดังนั้นฉันจะปล่อยให้วัตถุกล่องโต้ตอบถูกประมวลผลได้อย่างไรเมื่อโทร? ในความเป็นจริงคุณสามารถกำหนดวิธีการจัดการของวัตถุอินสแตนซ์โต้ตอบ แต่ต้องทำก่อนปุ่มใหม่ รหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
var app = handler ใหม่ ({
มือจับ: ฟังก์ชั่น () {
console.log ('App Handle');
-
}, 3);
กล่องโต้ตอบ var = ตัวจัดการใหม่ (แอพ, 1);
dialog.handle = function () {
console.log ('กล่องโต้ตอบก่อน ... ')
// นี่คือการดำเนินการประมวลผลเฉพาะ
console.log ('กล่องโต้ตอบหลังจาก ... ')
-
ปุ่ม var = ตัวจัดการใหม่ (กล่องโต้ตอบ, 2);
button.handle ();
ผลการดำเนินการของรหัสนี้เป็นกระบวนการที่ส่งผลใน dialog.handle และไม่ได้ดำเนินการดำเนินการของมือจับที่กำหนดไว้ในพารามิเตอร์ที่ส่งผ่านไปยังแอพอีกต่อไป
ดังนั้นเราสามารถทำให้ผ่านกระบวนการของผู้สืบทอดแล้วปล่อยให้ผู้สืบทอดดำเนินการต่อไปได้หรือไม่? คำตอบคือใช่ แต่หลังจากโทรไปที่มือจับคุณต้องใช้คุณสมบัติของต้นแบบเพื่อเรียกรหัสต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
handler.prototype.handle.call (นี่);
ความหมายของประโยคนี้คือการเรียกวิธีการจัดการต้นแบบเพื่อเรียกใช้วิธีการจัดการของผู้สืบทอดต่อไป (นั่นคือผู้สืบทอด) รหัสต่อไปนี้จะแสดงเป็น: มือจับที่กำหนดโดยวัตถุทั้งสามของปุ่ม/กล่องโต้ตอบ/แอปจะถูกดำเนินการ
การคัดลอกรหัสมีดังนี้:
var app = handler ใหม่ ({
มือจับ: ฟังก์ชั่น () {
console.log ('App Handle');
-
}, 3);
กล่องโต้ตอบ var = ตัวจัดการใหม่ (แอพ, 1);
dialog.handle = function () {
console.log ('กล่องโต้ตอบก่อน ... ')
// นี่คือการดำเนินการประมวลผลเฉพาะ
handler.prototype.handle.call (นี่); // ดำเนินการต่อไป
console.log ('กล่องโต้ตอบหลังจาก ... ')
-
ปุ่ม var = ตัวจัดการใหม่ (กล่องโต้ตอบ, 2);
button.handle = function () {
console.log ('ปุ่มก่อน ... ')
// นี่คือการดำเนินการประมวลผลเฉพาะ
handler.prototype.handle.call (นี่);
console.log ('ปุ่มหลังจาก ... ')
-
button.handle ();
ผ่านผลการดำเนินการของรหัสเราจะเห็นว่าหากคุณต้องการประมวลผลด้วยตัวเองก่อนแล้วโทรหาผู้สืบทอดเพื่อประมวลผลให้ดำเนินการ handler.prototype.handle.call (นี่); รหัสในตอนท้าย หากคุณต้องการประมวลผลรหัสของผู้สืบทอดก่อนให้ดำเนินการ handler.prototype.handle.call (นี่); รหัสที่จุดเริ่มต้น
สรุป
ห่วงโซ่ของความรับผิดชอบมักใช้กับรูปแบบการรวมกันเพื่อให้องค์ประกอบหลักของส่วนประกอบสามารถทำหน้าที่เป็นผู้สืบทอด
ในเวลาเดียวกันกลไกฟองสบู่ใน DOM ดูเหมือนจะคล้ายกันเล็กน้อย ตัวอย่างเช่นหลังจากคลิกปุ่มหากไม่ได้รับการป้องกันฟองสบู่เหตุการณ์การคลิกจะฟองไปยังองค์ประกอบหลักเสมอ กลไกนี้ยังสามารถใช้เพื่อจัดการกับปัญหาที่เกี่ยวข้องมากมายเช่นรหัสตัวอย่างของ "ตัวอย่างที่ 1: การจัดการเหตุการณ์ส่วนกลาง" ในรูปแบบการออกแบบของซีรี่ส์นี้