Im Allgemeinen sind wir mit den Entwurfsmustern (Beobachtern) oder Fabriken (Fabrikmethoden) in Node.js vertraut. Dieser Artikel konzentriert sich auf die Einführung der Implementierungsmethoden einiger grundlegender Muster in Node.JS. Interessierte Freunde können dem Editor von Script folgen Lassen Sie uns gemeinsam lernen. In diesem Artikel werden sie nicht speziell besprochen. Ich diskutiere nur die Implementierung einiger grundlegender Muster in Node.JS, wie z. B. Abhängigkeitsinjektion oder Middleware. Ich hoffe, dass es allen helfen kann.
Was sind Designmuster?
Entwurfsmuster sind wiederverwendbare Lösungen zur Lösung allgemeiner, häufig auftretender Probleme.
Singletons (Singleton)
Das Singletons-Muster beschränkt die „Klasse“ auf nur eine Instanz. Das Erstellen eines Singletons in Node.js ist sehr einfach, wie beispielsweise unten beschrieben.
//area.js var PI = Math.PI; function circle (radius) { return radius * radius * PI; } module.exports.circle = circle;
Es spielt keine Rolle, wie oft Sie darauf verweisen; es wird nur als einzelne Instanz existieren.
var areaCalc = require('./area'); console.log(areaCalc.circle(5));
Singletons sind aufgrund dieser Implementierung von require wahrscheinlich das häufigste Node.js-Entwurfsmuster in NPM-Modulen.
Beobachter
Ein Objekt, das eine Abhör-/Beobachtungsliste führt und sie automatisch benachrichtigt, wenn sich der Zustand ändert. Um das Beobachtermuster zu implementieren, ist EventEmitter praktisch.
// MyFancyObservable.js var util = require('util'); var EventEmitter = require('events').EventEmitter; function MyFancyObservable() { EventEmitter.call(this); } util.inherits(MyFancyObservable, EventEmitter);
Das ist es; wir haben ein Observable implementiert! Um es zu verwenden, fügen wir einige Methoden hinzu.
MyFancyObservable.prototype.hello = function (name) { this.emit('hello', name); };
Großartig, versuchen Sie, diesem Ereignis zuzuhören und darauf zu reagieren!
var MyFancyObservable = require('MyFancyObservable'); var observable = new MyFancyObservable(); observable.on('hello', function (name) { console.log(name); }); observable.hello('john');
Factorys (Factory-Methode)
Factory-Muster ist ein Erstellermuster, das keine Verwendung von Konstruktoren erfordert. Es bietet eine gemeinsame Schnittstelle zum Erstellen von Objekten. Dieses Muster kann verwendet werden, um Objekte zu generieren, deren Erstellung sehr komplex ist.
function MyClass (options) { this.options = options; } function create(options) { // modify the options here if you want return new MyClass(options); } module.exports.create = create;
Factorys erleichtern das Testen, da Sie Abhängigkeiten in sie einfügen können.
Abhängigkeitsinjektion
Abhängigkeitsinjektion ist ein Entwurfsmuster, bei dem eine oder mehrere Abhängigkeiten (oder Dienste) injiziert oder durch Verweis auf ein abhängiges Objekt übergeben werden.
In diesem Beispiel erstellen wir ein Benutzermodell, das die Datenbankabhängigkeiten abruft.
function userModel (options) { var db; if (!options.db) { throw new Error('Options.db is required'); } db = options.db; return { create: function (done) { db.query('INSERT ...', done); } } } module.exports = userModel;
Jetzt erstellen wir eine Instanz damit:
var db = require('./db'); var userModel = require('User')({ db: db });
Warum ist es nützlich? Dies erleichtert das Testen – wenn Sie Unit-Tests schreiben, können Sie gefälschte Datenbankinstanzen in das Modell einfügen.
Middlewares/Pipelines
Middleware ist ein leistungsstarkes und dennoch einfaches Konzept: Die Ausgabe einer Funktionseinheit ist die Eingabe der nächsten Funktionseinheit. Wenn Sie Express verwendet haben, haben Sie dieses Muster bereits verwendet.
Sehen wir uns an, wie Koa das macht:
app.use = function(fn){ this.middleware.push(fn); return this; };
Wenn Sie also eine Middleware hinzufügen, wird diese einfach in eine Middleware-Warteschlange verschoben. Aber was passiert, wenn eine Anfrage auf diesem Server eintrifft?
var i = middleware.length; while (i--) { next = middleware[i].call(this, next); }
Nichts Magisches – Ihre Middleware wird nacheinander aufgerufen.
Streams
Sie können Streams als spezielle Pipes behandeln. Es eignet sich besser für die Verarbeitung großer Datenströme, dh es handelt sich um Bytes und nicht um Objekte.
process.stdin.on('readable', function () { var buf = process.stdin.read(3); console.dir(buf); process.stdin.read(0); });
Detaillierte Erläuterung des Service-Locator-Musterbeispiels des PHP-Entwurfsmusters
Detaillierte Erläuterung des Delegationsmusters des PHP-Entwurfsmusters
Detaillierte Erläuterung des Memomusters von PHP-Entwurfsmustern
Das obige ist der detaillierte Inhalt vonBeispielanalyse gängiger grundlegender Entwurfsmuster in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!