Heim >Web-Frontend >js-Tutorial >Detaillierte Beispiele für die Unterschiede zwischen dem Fassadenmodus und dem Mediator-Modus im JavaScript-Design
Der Fassadenmodus spielt eine wichtige Rolle in der Architektur dieses Artikels. Dieser Modus spiegelt sich in vielen JavaScript-Bibliotheken oder Frameworks wider. Die größte Rolle besteht darin, die spezifische Implementierung auszublenden Stellen Sie die Schnittstelle bereit und wir können die interne Implementierung selbst vornehmen. Dies bedeutet auch, dass der interne Implementierungscode problemlos geändert und aktualisiert werden kann. Wenn Sie ihn beispielsweise heute mit jQuery implementieren und morgen auf YUI umsteigen möchten Es ist sehr praktisch.
Im folgenden Beispiel können Sie sehen, dass wir viele private Methoden bereitstellen und dann eine einfache API bereitstellen, damit die Außenwelt interne Methoden ausführen und aufrufen kann:
var module = (function () { var _private = { i: 5, get: function () { console.log('current value:' + this.i); }, set: function (val) { this.i = val; }, run: function () { console.log('running'); }, jump: function () { console.log('jumping'); } }; return { facade: function (args) { _private.set(args.val); _private.get(); if (args.run) { _private.run(); } } } } ()); module.facade({run:true, val:10}); //outputs current value: 10, running
Der Unterschied zwischen Facade und dem Mediator, über den wir weiter unten sprechen, besteht darin, dass die Fassade nur vorhandene Funktionen bereitstellt, während der Mediator neue Funktionen hinzufügen kann.
Mediator-Modus
Bevor wir über Modifikatoren sprechen, geben wir ein Beispiel: Das Flugkontrollsystem des Flughafens, auch bekannt als der legendäre Tower, hat absolute Rechte die Start- und Landezeit und der Ort jedes Flugzeugs, und Flugzeuge und Flugzeuge durften zuvor nicht kommunizieren. Mit anderen Worten, der Turm ist der Kern des Flughafens, und der Vermittler entspricht diesem Turm.
Mediator wird verwendet, wenn das Programm mehrere Module enthält und Sie nicht möchten, dass jedes Modul Abhängigkeiten aufweist. Der Zweck der zentralisierten Steuerung kann durch den Mediatormodus erreicht werden. Auch in tatsächlichen Szenarien kapselt der Mediator viele Module, die Sie nicht verwenden möchten, sodass sie über den Mediator verbunden werden können, und koppelt sie gleichzeitig lose, sodass sie über den Mediator kommunizieren müssen.
Was sind die Vorteile des Mediator-Modus? Das ist Entkopplung. Wenn Sie das Beobachtermuster zuvor gut verstanden haben, ist es relativ einfach, das folgende Mediatormusterdiagramm zu verstehen:
Denken Sie darüber nach: Jedes Modul ist ein Herausgeber und der Vermittler ist sowohl Herausgeber als auch Abonnent.
Modul 1 sendet eine Tatsache an Mediator und sagt, dass etwas getan werden muss.
Nachdem Mediator die Nachricht erfasst hat, startet es sofort Modul 2, das zur Verarbeitung der Nachricht verwendet werden muss. Nachdem Modul 2 die Verarbeitung abgeschlossen hat , gibt es die Informationen an Mediator zurück
Gleichzeitig startet Mediator auch Modul 3. Wenn es die von Modul 2 zurückgegebene Nachricht akzeptiert, zeichnet es das Protokoll automatisch in Modul 3 auf.
Wie Sie sehen können , es gibt keine Kommunikation zwischen den Modulen. Darüber hinaus kann Mediator auch die Überwachung jedes Modulstatus implementieren. Wenn beispielsweise Modul 3 einen Fehler aufweist, kann Mediator vorübergehend nur an andere Module denken und dann Modul 3 neu starten dann mit der Ausführung fortfahren.
Rückblickend können wir erkennen, dass der Vorteil von Mediator darin besteht, dass lose gekoppelte Module von demselben Mediator gesteuert werden. Die Module müssen nur Ereignisse senden und abhören, und es ist kein direkter Kontakt zwischen Modulen erforderlich Darüber hinaus können mehrere Module gleichzeitig für die Informationsverarbeitung verwendet werden, und es ist für uns auch praktisch, in Zukunft einheitlich neue Module zur bestehenden Steuerungslogik hinzuzufügen.
Auf jeden Fall: Da nicht alle Module direkt kommunizieren können, kann es zu leichten Leistungseinbußen kommen, aber ich denke, das lohnt sich.
Lassen Sie uns eine einfache Demo basierend auf der obigen Erklärung erstellen:
var mediator = (function(){ var subscribe = function(channel, fn){ if (!mediator.channels[channel]) mediator.channels[channel] = []; mediator.channels[channel].push({ context: this, callback: fn }); return this; }, publish = function(channel){ if (!mediator.channels[channel]) return false; var args = Array.prototype.slice.call(arguments, 1); for (var i = 0, l = mediator.channels[channel].length; i < l; i++) { var subscription = mediator.channels[channel][i]; subscription.callback.apply(subscription.context, args); } return this; }; return { channels: {}, publish: publish, subscribe: subscribe, installTo: function(obj){ obj.subscribe = subscribe; obj.publish = publish; } }; }());
Dann gibt es 2 Module, die separat aufgerufen werden :
//Pub/sub on a centralized mediator mediator.name = "tim"; mediator.subscribe('nameChange', function(arg){ console.log(this.name); this.name = arg; console.log(this.name); }); mediator.publish('nameChange', 'david'); //tim, david //Pub/sub via third party mediator var obj = { name: 'sam' }; mediator.installTo(obj); obj.subscribe('nameChange', function(arg){ console.log(this.name); this.name = arg; console.log(this.name); }); obj.publish('nameChange', 'john'); //sam, john
Anwendungsfassade: Eine Abstraktion des Kerns der Anwendung
Eine Fassade fungiert als Abstraktion des Kern der Anwendung, verantwortlich für die Kommunikation zwischen dem Vermittler und dem Modul. Jedes Modul kann nur über diese Fassade mit dem Programmkern kommunizieren. Als Abstraktion besteht die Verantwortung darin, sicherzustellen, dass für diese Module jederzeit eine konsistente Schnittstelle (konsistente Schnittstelle) bereitgestellt werden kann, ähnlich der Rolle des Sendbox-Controllers. Alle Modulkomponenten kommunizieren über ihn mit dem Mediator, daher muss die Fassade zuverlässig und vertrauenswürdig sein. Gleichzeitig muss die Fassade als Funktion der Bereitstellung einer Schnittstelle für das Modul auch eine andere Rolle spielen, nämlich die Sicherheitskontrolle , die entscheiden soll, auf welchen Teil des Programms ein Modul zugreifen kann. Modulkomponenten können nur ihre eigenen Methoden aufrufen und nicht auf nicht autorisierte Inhalte zugreifen. Beispielsweise kann ein Modul dataValidationCompletedWriteToDB senden, und die Sicherheitsprüfung muss hier sicherstellen, dass das Modul über Schreibberechtigungen für die Datenbank verfügt.
Kurz gesagt, der Mediator kann Informationen nur nach Erkennung der Fassadenberechtigung verarbeiten.
Bewerbungsvermittler: Der Kern der Bewerbung
Der Vermittler fungiert als Kernrolle der Bewerbung. Lassen Sie uns kurz über seine Aufgaben sprechen. Die Kernaufgabe besteht darin, den Lebenszyklus des Moduls zu verwalten. Wenn dieser Kern alle eingehenden Informationen erfasst, muss er bestimmen, wie das Programm damit umgehen soll – d. h. entscheiden, welches Modul oder welche Module gestartet oder gestoppt werden sollen. Wenn ein Modul gestartet wird, sollte es automatisch ausgeführt werden können, ohne dass der Anwendungskern entscheidet, ob es ausgeführt werden soll (z. B. ob es ausgeführt werden kann, wenn das DOM bereit ist), sodass das Modul selbst eine Entscheidung treffen muss.
Möglicherweise haben Sie noch Fragen zu den Umständen, unter denen ein Modul gestoppt wird. Wenn das Programm erkennt, dass ein Modul ausgefallen ist oder ein Fehler aufgetreten ist, muss das Programm eine Entscheidung treffen, um zu verhindern, dass die Methode im Modul weiterhin ausgeführt wird, damit die Komponente neu gestartet werden kann. Der Hauptzweck besteht darin, den Benutzer zu verbessern Erfahrung.
Darüber hinaus sollte der Kern in der Lage sein, Module dynamisch hinzuzufügen oder zu entfernen, ohne andere Funktionen zu beeinträchtigen. Ein häufiges Beispiel ist, dass ein Modul zu Beginn des Seitenladens nicht verfügbar ist, das Modul jedoch nach der Benutzerbedienung dynamisch geladen und ausgeführt werden muss, genau wie die Chat-Funktion in Gmail. Aus Sicht der Leistungsoptimierung sollte dies der Fall sein sehr gut. Verstehe es.
Die Behandlung von Ausnahmefehlern wird ebenfalls vom Anwendungskern übernommen. Wenn jedes Modul Informationen sendet, sendet es außerdem auch alle Fehler an den Kern, sodass der Programmkern diese Module je nach Situation stoppen/neu starten kann . Dies ist auch ein wichtiger Teil der lose gekoppelten Architektur. Wir müssen keine Module manuell ändern. Dies können wir durch die Verwendung von Publish/Subscribe über den Mediator tun.
Das obige ist der detaillierte Inhalt vonDetaillierte Beispiele für die Unterschiede zwischen dem Fassadenmodus und dem Mediator-Modus im JavaScript-Design. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!