Terakhir kali saya mempelajari mode pengamat, banyak artikel mengatakan bahwa itu juga disebut berlangganan/publikasi (Mode Publikasikan/Berlangganan). Tetapi dalam buku "JavaScript Design Pattern", masih ada beberapa perbedaan antara kedua pola. Kata -kata asli dalam buku ini adalah sebagai berikut:
1. Mode pengamat mengharuskan pengamat yang ingin menerima pemberitahuan topik harus berlangganan peristiwa di mana konten berubah.
2.Subscribe/Publish Mode menggunakan saluran tema/acara, yaitu antara pelanggan dan penerbit. Sistem acara memungkinkan kode untuk mendefinisikan peristiwa spesifik untuk aplikasi, yang dapat melewati parameter khusus yang berisi nilai yang diperlukan oleh pelanggan. Tujuannya adalah untuk menghindari ketergantungan antara pelanggan dan penerbit.
Perbedaan dari mode pengamat adalah memungkinkan pelanggan untuk menjalankan penangan acara yang sesuai untuk mendaftar dan menerima pemberitahuan dari penerbit.
Oke, saya tidak tahu bagaimana menjadi begitu kuat. Inilah pemahaman saya:
1. Dalam mode pengamat, objek target bertanggung jawab untuk memelihara pengamat. Dalam mode publikasi/berlangganan, penerbit tidak peduli dengan pelanggan, mereka hanya bertanggung jawab untuk membuang pesan dan meninggalkannya sendirian.
2. Dalam mode pengamat, pengamat perlu menyediakan antarmuka, dan kemudian memanggil antarmuka ini ketika objek target berubah untuk menjaga status sendiri dan keadaan target konsisten. Artinya, semua pengamat harus memiliki antarmuka terpadu (misalnya, metode pembaruan yang ditulis di atas, metode semua orang harus disebut nama ini). Dalam mode publikasi/berlangganan, pemicu acara pelanggan tidak bergantung pada antarmuka seperti itu, tetapi dipicu oleh pelanggan dengan mendengarkan pesan tertentu (pesan ini umumnya berisi nama dan parameter yang diperlukan oleh pelanggan). Dapat dipahami bahwa pelanggan tidak mendengarkan penerbit, tetapi kumpulan pesan. Selama ada pesan yang dipedulikan di kumpulan pesan, itu memicu acara, tidak peduli siapa yang memposting pesan di masa lalu. Penerbit dan pelanggan dipisahkan.
Berikut ini adalah implementasi mode publikasi/berlangganan di JS. Salin dan tempel ke konsol dan Anda akan memahaminya setelah mencoba:
Salinan kode adalah sebagai berikut:
var pubsub = (function () {
var q = {}
topik = {},
subuid = -1;
// Publikasikan pesan
q.publish = function (topic, args) {
if (! Topics [topic]) {return;}
var subs = topik [topik],
len = subs.length;
while (len--) {
Subs [len] .func (topik, args);
}
kembalikan ini;
};
// Berlangganan acara
q.subscribe = function (topic, func) {
Topik [Topik] = Topik [Topik]? Topik [Topik]: [];
var token = (++ subuid) .toString ();
Topik [topik] .push ({
Token: Token,
Func: Func
});
Token kembali;
};
mengembalikan q;
// berhenti berlangganan dan berhenti menulis, melintasi topik, dan kemudian mengembalikan token dengan menyimpan yang sebelumnya, hapus elemen yang ditentukan
}) ();
// acara yang dipicu
var logmsg = fungsi (topik, data) {
console.log ("logging:" + topik + ":" + data);
}
// dengarkan pesan 'msGname' yang ditentukan
var sub = pubsub.subscribe ('msGname', logmsg);
// memposting pesan 'msGname'
pubsub.publish ('msGname', 'Hello World');
// memposting pesan tidak terdaftar 'msGname1'
pubsub.publish ('OtherMsGname', 'Me Too!');