Was ist das Publish-Subscribe-Modell? Kannst du es mit der Hand schreiben? Unterscheidet es sich vom Beobachtermuster? ... 1. SzeneneinführungSchauen wir uns ein Szenario wie dieses an: Angenommen, es gibt eine soziale Plattform mit einer berühmten Person namens Nami ist sehr talentiert und vielseitig. Derzeit hat sie zwei Fähigkeiten: Lieder schreiben und Videos drehen. Sie wird diese Arbeiten auf der Plattform veröffentlichen. Fans, die ihr folgen, erhalten diese Inhalte Jetzt hat er 3 Fans, nämlich: Luffy, Zoro, Sanji Jedes Mal, wenn Nami ein Werk veröffentlicht, werden die auf den Konten der drei Fans eingegangenen Nachrichten aktualisiert. Lassen Sie es uns nun in Code ausdrücken: const Ruffy = { Update: Funktion (Lieder, Videos) { console.log(Lieder, Videos); }, }; const zoro = { Update: Funktion (Lieder, Videos) { console.log(Lieder, Videos); }, }; const sanji = { Update: Funktion (Lieder, Videos) { console.log(Lieder, Videos); }, }; const nami = { // Diese Methode wird aufgerufen, wenn Namis Arbeit aktualisiert wird workUpdate: function () { // Werke abrufen const songs = this.getSongs(); const videos = this.getVideos(); //Kontoaktualisierung luffy.update(songs, videos); zoro.update(Lieder, Videos); sanji.update(Lieder, Videos); }, getSongs: Funktion () { gib "mp3" zurück; }, getVideos: Funktion () { gib "mp4" zurück; }, }; Jetzt kommt das Problem
Irgendein Problem gefunden? Die Kopplung zwischen dem Fan-Objekt und dem Influencer-Objekt ist zu hoch, sodass eine unabhängige Skalierung der einzelnen Objekte schwierig ist. 2 Code-Optimierung2.1 Lösen Sie das Problem der zunehmenden Fans Lösen wir zuerst das erste Problem, damit wir Zuerst abstrahieren wir das „große V“ in eine Klasse „Star“, verwenden das Array Klasse Stern { Konstruktor() { diese.fans = []; } addFans(Fan) { this.fans.push(Lüfter) } arbeitsUpdate() { const songs = this.getSongs(); const videos = this.getVideos(); this.fans.forEach((item) => item.update(songs, videos)); } getSongs() { gib "MP3" zurück; } getVideos() { gib "MP4" zurück; } } Als nächstes abstrahieren wir „Fans“ in eine Klasse Fan. Beim Erstellen eines Fan-Objekts übergeben wir das „große V“-Objekt und rufen die Klasse Fan { Konstruktor(Name, Stern) { dieser.name = Name dieser.Stern = Stern dies.star.addFans(dies) } Update (Lieder, Videos) { console.log(Lieder, Videos); } } Jetzt müssen wir den Code nicht mehr ändern, um Fans hinzuzufügen const nami = neuer Stern() const luffy = neuer Fan("luffy", nami); const zoro = neuer Fan("zoro", nami); const sanji = neuer Fan("sanji", nami); const robin = neuer Fan("robin", nami); nami.workUpdate() 2.2 Lösen Sie das Problem des Hinzufügens von Werken Wir fügen ein Klasse Stern { Konstruktor() { diese.fans = []; dies.funktioniert = []; } addFans(Fan) { dies.fans.push(Ventilator); } setWorks(Arbeit) { dies.funktioniert.push(arbeit); // Rufen Sie nach dem Hinzufügen der Arbeit die Aktualisierungsmethode this.workUpdate(); auf. } getWorks() { gib dies zurück.funktioniert; } arbeitsUpdate() { diese.fans.forEach((item) => item.update()); } } Passen Sie die Fan-Klasse entsprechend an: Klasse Fan { Konstruktor(Name, Stern) { dieser.name = Name dieser.Stern = Stern dies.star.addFans(dies) } aktualisieren() { Konsole.log(`${this.name}:${this.star.getWorks()}`) } } Jetzt müssen große Vs den Code nicht mehr ändern, um Werke hinzuzufügen: const nami = neuer Stern(); nami.setWorks('Lied') nami.setWorks('Video') nami.setWorks('Roman') const luffy = neuer Fan("luffy", nami); const zoro = neuer Fan("zoro", nami); const sanji = neuer Fan("sanji", nami); nami.workUpdate(); 3 Beobachtermuster Wie Sie sehen, besteht im obigen Beispiel eine Eins-zu-viele-Abhängigkeitsbeziehung zwischen einem Tatsächlich ist dies der Beobachtermodus
Wir abstrahieren den Code in 2.2 weiter: Die „Fans“ werden als Der spezifische Code lautet wie folgt: //Beobachter: Betreffklasse Betreff { Konstruktor() { diese.Beobachterliste = []; // Stellt den Subjektstatus dar this.state = 0; } addObserver(Beobachter) { dies.observerList.push(Beobachter); } // Den Designstatus ändern setState(state) { dieser.zustand = zustand; //Nach der Statusänderung alle Beobachter benachrichtigen this.notify(); } getState() { gib diesen Status zurück; } benachrichtigen() { this.observerList.forEach((Beobachter) => Beobachter.update()); } } //Beobachterklasse Beobachter { Konstruktor(Name, Betreff) { dieser.name = Name; dieses.Betreff = Betreff; dies.subject.addObserver(dies); } aktualisieren() { console.log(`${this.name}:${this.subject.state}`); } } 4 Agenten erscheinenDa die großen Vs mit ihrem Geschäft beschäftigt sind, brauchen sie Agenten, um die Verbindung zwischen Künstlern und Fans aufrechtzuerhalten. Zu den Aufgaben eines Maklers gehören:
Abstrahieren Sie in eine Klasse wie folgt: Klasse Manager { Konstruktor() { diese.fans = []; dies.funktioniert = []; } addFans(Fan) { dies.fans.push(Ventilator); } setWorks(Arbeit) { dies.funktioniert.push(arbeit); // Rufen Sie nach dem Hinzufügen der Arbeit die Aktualisierungsmethode this.workUpdate(); auf. } getWorks() { gib dies zurück.funktioniert; } arbeitsUpdate() { diese.fans.forEach((item) => item.update()); } } Äh? Wo haben Sie diesen Code schon einmal gesehen? Ja, es ist genau dasselbe wie die Star-Klasse in 2.2, außer dass der Klassenname geändert wurde. Ist es also sinnvoll, dies zu tun? Tatsächlich ist der Code genau derselbe, da wir in der Star-Klasse von 2.2 nur Funktionen geschrieben haben, die mit dem Veröffentlichen (also dem Veröffentlichen von Werken) und Abonnieren (also dem Verwalten einer Fanliste) zu tun haben; und die Star-Klasse selbst kann mehr als nur diese Aufgaben haben, beispielsweise das Erstellen von Inhalten. Jetzt extrahieren wir die Veröffentlichungs- und Abonnementarbeit aus Andererseits interagieren Der Code für Star und Fan lautet also wie folgt: Klasse Stern { Konstruktor() {} // Erstellen create(manager) { // Übermitteln Sie die erstellte neue Arbeit an den Agenten manager.setWorks("neue Arbeit"); } } Klasse Fan { Konstruktor(Name, Manager) { dieser.name = Name; dieser.manager = Manager; dies.manager.addFans(dies); } aktualisieren() { console.log(`${this.name}:${this.manager.getWorks()}`); } } 5 Publish-Subscribe-Modell Früher haben wir einen Broker für das Veröffentlichen und Abonnieren eingesetzt und keine direkte Interaktion zwischen Dies ist das Publish-Subscribe-Modell Wir abstrahieren den Manager weiter in 4: Stellen Sie sich „Fans“ als Der spezifische Code lautet wie folgt: //Veröffentlichen und abonnieren Sie die Scheduling-Center-Klasse Broker { Konstruktor() { diese.abonnenten = []; // Stellt den Subjektstatus dar this.state = 0; } // Abonnierenabonnieren(Abonnent) { dies.subscribers.push(Abonnent); } // Den Designstatus ändern setState(state) { dieser.zustand = zustand; //Nachdem sich der Status geändert hat, veröffentlichen Sie dies.publish(); } getState() { gib diesen Status zurück; } // Veröffentlichen publish() { this.subscribers.forEach((Abonnent) => Abonnent.update()); } } // Publisher-Klasse Publisher { Konstruktor() {} changeState(Broker, Status) { broker.setState(status); } } Klasse Abonnent { Konstruktor(Name, Broker) { dieser.name = Name; dieser.Broker = Makler; dies.broker.subscribe(dies); } aktualisieren() { Konsole.log(`${this.name}:${this.broker.getState()}`); } } Lassen Sie es uns ausführen und die Wirkung beobachten: // Ein Dispatch-Center erstellen const broker = new Broker() // Einen Herausgeber erstellen const publisher = new Publisher() // Einen Abonnenten erstellen const subscribe1 = new Subscriber('s1', broker) const subscribe2 = neuer Abonnent('s2', Broker) const subscribe3 = neuer Abonnent('s3', Broker) // Der Herausgeber ändert den Status und benachrichtigt das Dispatch Center, das dann jeden Abonnenten benachrichtigt publisher.changeState(broker, 1) 6 Vergleich zwischen Observer-Modus und Publish-Subscribe-ModusIn Bezug auf die Anzahl der Rollen
Vom Kopplungsgrad
Aus der Perspektive der Absicht
Dies ist das Ende dieses Artikels zum Schreiben eines Publish-Subscribe-Modells mit JS. Weitere relevante Inhalte zum Schreiben eines Publish-Subscribe-Modells mit JS finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Eine kurze Analyse von Kubernetes-Controllern und -Labels
>>: Hauptfunktionen von MySQL Innodb: Einfügepuffer
Seit der Einführung des contentEditable-Attributs ...
Das Umschreibmodul ist das Modul ngx_http_rewrite...
Stellen Sie Tomcat so ein, dass der Dienst automa...
Hintergrund Dieser Fehler wurde dadurch verursach...
Lösung 1: Verwenden Sie bedingten Import im HTML-...
Vorbereitung Zuerst müssen Sie nodejs herunterlad...
Inhaltsverzeichnis 1. Variablen Verwenden Sie aus...
Inhaltsverzeichnis Lassen Sie uns zunächst kurz P...
Vorwort Linux verfügt über entsprechende Open-Sou...
Ich bin heute auf ein Problem gestoßen: Kann ich ...
In diesem Artikel wird der spezifische JavaScript...
Die Rolle der Schnittstelle: Schnittstelle, auf E...
Die Beispiele in diesem Artikel sind alle in klei...
In diesem Artikel sind einige sogenannte Spezifik...
<br />Vorheriger Artikel: Webdesign-Tutorial...