memperkenalkan
Rantai tanggung jawab adalah memungkinkan banyak objek memiliki kesempatan untuk memproses permintaan, sehingga menghindari hubungan kopling antara pengirim dan penerima permintaan. Hubungkan objek ke dalam rantai dan berikan permintaan di sepanjang rantai sampai suatu objek menanganinya.
Yaitu, setelah permintaan, mulai dari objek pertama, objek yang menerima permintaan dalam rantai menanganinya secara pribadi atau meneruskannya ke kandidat berikutnya dalam rantai. Objek yang mengirimkan permintaan tidak tahu persis objek mana yang akan menanganinya - yaitu, permintaan memiliki penerima implisit. Bergantung pada waktu berjalan, setiap kandidat dapat menanggapi permintaan yang sesuai. Jumlah kandidat adalah sewenang -wenang. Anda dapat memutuskan kandidat mana yang berpartisipasi dalam rantai pada waktu berjalan.
teks
Untuk implementasi JavaScript, kami dapat menggunakan fitur prototipe untuk mengimplementasikan pola rantai tanggung jawab.
Salinan kode adalah sebagai berikut:
var no_topic = -1;
Topik VAR;
function handler (s, t) {
this.successor = s || batal;
this.topic = t || 0;
}
Handler.prototype = {
handle: function () {
if (this.successor) {
this.successor.handle ()
}
},
memiliki: function () {
kembalikan this.topic! = no_topic;
}
};
Handler hanya menerima 2 parameter. Yang pertama adalah penerus (digunakan untuk meneruskan permintaan pemrosesan ke bawah), dan yang kedua adalah level passing (yang dapat digunakan untuk mengontrol apakah akan melakukan operasi pada level tertentu, atau tidak). Prototipe penangan memperlihatkan metode pegangan, yang merupakan kunci untuk mengimplementasikan pola ini. Pertama -tama mari kita lihat cara menggunakan kode di atas.
Salinan kode adalah sebagai berikut:
var app = handler baru ({
handle: function () {
console.log ('handle app');
}
}, 3);
dialog var = pawang baru (aplikasi, 1);
var tombol = pawang baru (dialog, 2);
tombol.handle ();
Ubah kode melalui fitur prototipe dan hubungi kode dari tombol.handle ()-> dialog.handle ()-> app.handle ()-> parameter handle (). Tiga yang pertama adalah semua pegangan yang memanggil prototipe. Akhirnya, pegangan dalam parameter yang diteruskan ditemukan, dan kemudian hasilnya adalah output, yang berarti bahwa hanya lapisan terakhir yang diproses.
Jadi bagaimana saya bisa membiarkan objek dialog diproses saat menelepon? Bahkan, Anda dapat menentukan metode pegangan dari objek instance dialog, tetapi perlu dilakukan sebelum tombol baru. Kodenya adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
var app = handler baru ({
handle: function () {
console.log ('handle app');
}
}, 3);
dialog var = pawang baru (aplikasi, 1);
dialog.handle = function () {
Console.log ('Dialog Sebelum ...')
// Berikut adalah operasi pemrosesan khusus
Console.log ('Dialog setelah ...')
};
var tombol = pawang baru (dialog, 2);
tombol.handle ();
Hasil eksekusi dari kode ini adalah hasil proses dalam dialog.handle, dan tidak lagi operasi eksekusi pegangan yang ditentukan dalam parameter yang diteruskan ke aplikasi.
Jadi bisakah kita berhasil melalui proses penerus dan kemudian membiarkan penerus terus menanganinya? Jawabannya adalah ya, tetapi setelah memanggil pegangan, Anda perlu menggunakan karakteristik prototipe untuk memanggil kode berikut:
Salinan kode adalah sebagai berikut:
Handler.prototype.handle.call (ini);
Arti dari kalimat ini adalah untuk memanggil metode pegangan prototipe untuk terus memanggil metode pegangan penggantinya (yaitu, penerus). Kode berikut dinyatakan sebagai: pegangan yang ditentukan oleh tiga objek tombol/dialog/aplikasi akan dieksekusi.
Salinan kode adalah sebagai berikut:
var app = handler baru ({
handle: function () {
console.log ('handle app');
}
}, 3);
dialog var = pawang baru (aplikasi, 1);
dialog.handle = function () {
Console.log ('Dialog Sebelum ...')
// Berikut adalah operasi pemrosesan khusus
Handler.prototype.handle.call (ini); // Terus naik
Console.log ('Dialog setelah ...')
};
var tombol = pawang baru (dialog, 2);
Button.Handle = function () {
Console.log ('tombol Sebelum ...')
// Berikut adalah operasi pemrosesan khusus
Handler.prototype.handle.call (ini);
console.log ('tombol setelah ...')
};
tombol.handle ();
Melalui hasil yang berjalan dari kode, kita dapat melihat bahwa jika Anda ingin memprosesnya sendiri terlebih dahulu dan kemudian memanggil penerus untuk memprosesnya, jalankan handler.prototype.handle.call (ini); Kode di akhir. Jika Anda ingin memproses kode penerus terlebih dahulu, jalankan handler.prototype.handle.call (ini); kode di awal.
Meringkaskan
Rantai tanggung jawab sering digunakan dengan pola kombinasi, sehingga komponen induk dari suatu komponen dapat berfungsi sebagai penggantinya.
Pada saat yang sama, mekanisme gelembung acara di DOM tampaknya sedikit mirip dengan ini. Misalnya, setelah mengklik tombol, jika gelembung tidak dicegah, acara klik akan selalu menggelembung ke arah elemen induk. Mekanisme ini juga dapat digunakan untuk menangani banyak masalah terkait, seperti contoh kode "Contoh 1: Manajemen Acara Terpusat" dalam pola desain seri ini.