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
Durch Ausnutzen einer neu entdeckten Sudo-Sicherh...
Problembeschreibung: Code kopieren Der Code laute...
Inhaltsverzeichnis Erstellen eines Images Dateist...
1. Problemsymptome Version: MySQL 5.6, unter Verw...
1. Problembeschreibung Heute muss ich die Systemp...
Dieses Tutorial ist nur auf Windows-Systemen anwe...
1. Die Beziehung zwischen Schriftarten und Zeiche...
1. Einleitung Nginx ist ein kostenloser, quelloff...
Abfrage der Gesamtgröße aller Datenbanken So geht...
Für Windows-Benutzer Verwenden von openGauss in D...
Tomcat konfigurieren Installieren Sie zuerst Tomc...
Wenn Docker einen Container erstellt, verwendet e...
In diesem Artikel werden hauptsächlich die folgen...
In diesem Artikel wird der spezifische Code von V...
1. Hintergrund Wenn der Docker-Dienst gestartet w...