ครั้งสุดท้ายที่ฉันศึกษาโหมดผู้สังเกตการณ์บทความจำนวนมากบอกว่าเรียกอีกอย่างว่าการสมัครสมาชิก/เผยแพร่ (โหมดเผยแพร่/สมัครสมาชิก) แต่ในหนังสือ "รูปแบบการออกแบบ JavaScript" ยังมีความแตกต่างบางอย่างระหว่างสองรูปแบบ คำดั้งเดิมในหนังสือมีดังนี้:
1. โหมดผู้สังเกตการณ์ต้องการผู้สังเกตการณ์ที่ต้องการรับการแจ้งเตือนหัวข้อจะต้องสมัครสมาชิกเหตุการณ์ที่มีการเปลี่ยนแปลงเนื้อหา
2. โหมดอธิบาย/เผยแพร่ใช้ช่องทางธีม/เหตุการณ์ซึ่งอยู่ระหว่างสมาชิกและผู้เผยแพร่ ระบบเหตุการณ์อนุญาตให้โค้ดกำหนดเหตุการณ์เฉพาะสำหรับแอปพลิเคชันซึ่งสามารถผ่านพารามิเตอร์ที่กำหนดเองที่มีค่าที่สมาชิกต้องการ วัตถุประสงค์คือเพื่อหลีกเลี่ยงการพึ่งพาระหว่างสมาชิกและผู้เผยแพร่
ความแตกต่างจากโหมดผู้สังเกตการณ์คือช่วยให้สมาชิกใด ๆ สามารถดำเนินการตัวจัดการเหตุการณ์ที่เหมาะสมเพื่อลงทะเบียนและรับการแจ้งเตือนจากผู้เผยแพร่
ตกลงฉันไม่รู้ว่าจะมีพลังได้อย่างไร นี่คือความเข้าใจของฉัน:
1. ในโหมดผู้สังเกตการณ์วัตถุเป้าหมายมีหน้าที่ดูแลผู้สังเกตการณ์ ในโหมดเผยแพร่/สมัครสมาชิกผู้เผยแพร่ไม่สนใจเกี่ยวกับสมาชิกพวกเขามีหน้าที่รับผิดชอบในการทิ้งข้อความและปล่อยให้พวกเขาอยู่คนเดียว
2. ในโหมดผู้สังเกตการณ์ผู้สังเกตการณ์จะต้องจัดเตรียมอินเทอร์เฟซแล้วเรียกใช้อินเทอร์เฟซนี้เมื่อวัตถุเป้าหมายเปลี่ยนไปเพื่อรักษาสถานะของตัวเองและสถานะเป้าหมายที่สอดคล้องกัน นั่นคือผู้สังเกตการณ์ทุกคนจะต้องมีอินเทอร์เฟซแบบครบวงจร (ตัวอย่างเช่นวิธีการอัปเดตที่เขียนไว้ข้างต้นวิธีการของทุกคนจะต้องเรียกชื่อนี้) ในโหมดการเผยแพร่/สมัครสมาชิกการทริกเกอร์ของเหตุการณ์สมาชิกไม่ได้ขึ้นอยู่กับอินเทอร์เฟซดังกล่าว แต่ถูกเรียกโดยสมาชิกโดยการฟังข้อความที่เฉพาะเจาะจง (โดยทั่วไปข้อความนี้มีชื่อและพารามิเตอร์ที่สมาชิกต้องการ) สามารถเข้าใจได้ว่าสมาชิกไม่ได้ฟังผู้เผยแพร่ แต่เป็นกลุ่มข้อความ ตราบใดที่มีข้อความที่ใส่ใจในกลุ่มข้อความมันจะกระตุ้นเหตุการณ์ไม่ว่าใครจะโพสต์ข้อความในอดีต ผู้เผยแพร่และสมาชิกถูกแยกออก
ต่อไปนี้คือการใช้โหมดการเผยแพร่/สมัครสมาชิกใน JS คัดลอกและวางลงในคอนโซลแล้วคุณจะเข้าใจหลังจากพยายาม:
การคัดลอกรหัสมีดังนี้:
var pubsub = (ฟังก์ชัน () {
var q = {}
หัวข้อ = {}
subuid = -1;
// เผยแพร่ข้อความ
Q.Publish = ฟังก์ชั่น (หัวข้อ, args) {
if (! หัวข้อ [หัวข้อ]) {return;}
var subs = หัวข้อ [หัวข้อ]
len = subs.length;
ในขณะที่ (เลน-) {
subs [len] .func (หัวข้อ, args);
-
คืนสิ่งนี้;
-
// สมัครสมาชิกกิจกรรม
Q.Subscribe = ฟังก์ชั่น (หัวข้อ, func) {
หัวข้อ [หัวข้อ] = หัวข้อ [หัวข้อ]? หัวข้อ [หัวข้อ]: [];
var token = (++ subuid) .tostring ();
หัวข้อ [หัวข้อ] .push ({
โทเค็น: โทเค็น
func: func
-
โทเค็นกลับมา;
-
return q;
// ยกเลิกการสมัครและหยุดการเขียนหัวข้อการสำรวจและจากนั้นกลับมาโทเค็นโดยการบันทึกก่อนหน้านี้ลบองค์ประกอบที่ระบุ
-
// เหตุการณ์ทริกเกอร์
var logmsg = function (หัวข้อ, ข้อมูล) {
console.log ("การบันทึก:" + หัวข้อ + ":" + data);
-
// ฟังข้อความที่ระบุ 'msgname'
var sub = pubsub.subscribe ('msgname', logmsg);
// โพสต์ข้อความ 'msgname'
pubsub.publish ('msgname', 'Hello World');
// โพสต์ข้อความที่ไม่อยู่ในรายการ 'msgname1'
pubsub.publish ('othermsgname', 'me too!');