The first thing that comes to mind when everyone talks about design patterns is singletons, observers (observers) or factories (factory methods). This article focuses on introducing the implementation methods of some basic patterns in Node.JS. Interested friends can follow the editor of Script House to learn together
When it comes to design patterns, you may think of singletons and observers (observers) Or factories (factory methods). This article does not discuss them specifically. Just explore the implementation of some basic patterns in Node.JS, like dependency injection or middleware.
What are design patterns?
Design patterns are reusable solutions used to solve general, commonly occurring problems.
Singletons (Singleton)
The Singletons pattern limits a "class" to only one instance. Creating a singleton in Node.js is very simple, such as the require below.
//area.js var PI = Math.PI; function circle (radius) { return radius * radius * PI; } module.exports.circle = circle;
It doesn’t matter how many times you reference it; it will only exist as a single instance.
var areaCalc = require('./area'); console.log(areaCalc.circle(5));
Singletons are probably the most common Node.js design pattern in NPM modules due to this implementation of require.
Observers
An object that maintains a listening/observation list and automatically notifies them when the state changes. In order to implement the observer pattern, EventEmitter comes in handy.
// MyFancyObservable.js var util = require('util'); var EventEmitter = require('events').EventEmitter; function MyFancyObservable() { EventEmitter.call(this); } util.inherits(MyFancyObservable, EventEmitter);
That’s it; we have implemented an observable object! To use it, let's add some methods.
MyFancyObservable.prototype.hello = function (name) { this.emit('hello', name); };
Great, try listening and responding to this event!
var MyFancyObservable = require('MyFancyObservable'); var observable = new MyFancyObservable(); observable.on('hello', function (name) { console.log(name); }); observable.hello('john');
Factories (Factory method)
Factory pattern is a creator pattern and does not require We use constructors, which provide a common interface for creating objects. This pattern can be used to generate objects that are very complex to create.
function MyClass (options) { this.options = options; } function create(options) { // modify the options here if you want return new MyClass(options); } module.exports.create = create;
Factories can make testing easier because you can inject dependencies into them.
Dependency Injection Dependency Injection
Dependency injection is to inject one or more dependencies (or services) into the Design pattern for dependent objects.
In this example, we will create a usermodel which obtains database dependencies.
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;
Now, we use it to create an instance:
var db = require('./db'); var userModel = require('User')({ db: db });
Why is it useful? It makes testing easier - when you write unit tests, you can inject fake database instances into the model.
Middlewares/pipelinesMiddlewares/pipelines
Middleware is a powerful yet simple concept: the output of one functional unit is the output of the next input to the functional unit. If you've used Express then you've already used this pattern.
Let's take a look at how Koa does it:
app.use = function(fn){ this.middleware.push(fn); return this; };
So basically when you add a middleware, it's just pushed into a in the middleware queue. But what happens when a request arrives at this server?
var i = middleware.length; while (i--) { next = middleware[i].call(this, next); }
Nothing magical - your middleware is called one after the other.
Streams
You can treat streams as special pipes. It is more suitable for processing large data streams, that is, they are bytes, not objects.
process.stdin.on('readable', function () { var buf = process.stdin.read(3); console.dir(buf); process.stdin.read(0); });
The above is the detailed content of Introduction to common basic design patterns in Node.js. For more information, please follow other related articles on the PHP Chinese website!