深入理解Node.js中通用基础设计模式


Posted in Javascript onSeptember 19, 2017

谈到设计模式,你可能会想到 singletons, observers(观察者) 或 factories(工厂方法)。本文不并专门探讨他们。只是探讨Node.JS一些基础模式的实现,像依赖注入或中间件。

什么是设计模式?

设计模式是用来解决一般的,普遍发生的问题,且可重复使用的解决方案。

Singletons (单例)

Singletons模式限制了“类”,只有一个实例。在Node.js的创建单例是非常简单的,比如下面这个require。

//area.js
var PI = Math.PI;
function circle (radius) { 
 return radius * radius * PI;
}
module.exports.circle = circle;

你引用多少次都没有关系;它将只存在一个单一的实例。

var areaCalc = require('./area');
console.log(areaCalc.circle(5));

由于 require 的这种实现,单例可能在NPM模块中最常见的Node.js设计模式。

Observers(观察者)

一个维护了侦听/观察列表的对象,当状态改变时会自动通知他们。为了实现观察者模式,EventEmitter就派上用场了。

// MyFancyObservable.js
var util = require('util'); 
var EventEmitter = require('events').EventEmitter;
function MyFancyObservable() { 
 EventEmitter.call(this);
}
util.inherits(MyFancyObservable, EventEmitter);

就是这个;我们实现了一个可观察的对象!为了用它,让我们添加一些方法吧。

MyFancyObservable.prototype.hello = function (name) { 
 this.emit('hello', name);
};

太好了,试试侦听并响应这个事件!

var MyFancyObservable = require('MyFancyObservable'); 
var observable = new MyFancyObservable();
observable.on('hello', function (name) { 
 console.log(name);
});
observable.hello('john');

Factories (工厂方法)

工厂模式是一种创建者模式,不需要我们使用构造函数,它提供用于创建对象的通用接口。这种模式可以用于生成创建过程非常复杂的对象。

function MyClass (options) { 
 this.options = options;
}
function create(options) { 
 // modify the options here if you want
 return new MyClass(options);
}
module.exports.create = create;

工厂可以让测试更简单,因为你可以在里面注入依赖关系。

Dependency Injection 依赖注入

依赖注入是将其中的一个或多个依赖(或服务)注入,或通过引用传递到从属对象的设计模式。

在这个例子中,我们将创建一个的usermodel它获取数据库的依赖。

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;

现在,我们利用它创建一个实例:

var db = require('./db');
var userModel = require('User')({ 
 db: db
});

它为什么有用呢?它使测试变得更容易 - 当你写单元测试时,你可以把假的数据库实例注入模型。

Middlewares/pipelines 中间件/管道

中间件是一个强大功能且简单的概念:一个功能单元的输出是下一个功能单元的输入。如果你用过Express那么你已经使用了这个模式。

我们看一看 Koa 是如何做的:

app.use = function(fn){ 
 this.middleware.push(fn);
 return this;
};

所以基本上,当你添加一个中间件时,它只是被压入一个中间件队列中。但是当一个请求到达这个服务器会发生什么?

var i = middleware.length; 
while (i--) { 
 next = middleware[i].call(this, next);
}

没什么神奇的 - 你的中间件被一个接着一个调用了。

Streams

你可以把流作为特殊的管道。他比较适合处理大量数据流,即他们是字节,而不是对象。

process.stdin.on('readable', function () { 
  var buf = process.stdin.read(3);
  console.dir(buf);
  process.stdin.read(0);
});

总结

以上所述是小编给大家介绍的Node.js中通用基础设计模式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
setAttribute 与 class冲突解决
Feb 17 Javascript
javascript IFrame 强制刷新代码
Jul 23 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
Oct 11 Javascript
jquery创建表格(自动增加表格)代码分享
Dec 25 Javascript
addEventListener 的用法示例介绍
May 07 Javascript
元素绑定click点击事件方法
Jun 08 Javascript
javascript中的作用域和闭包详解
Jan 13 Javascript
js中用cssText设置css样式的简单方法
Sep 19 Javascript
jQuery拖拽通过八个点改变div大小
Nov 29 Javascript
js中的面向对象入门
Mar 06 Javascript
JavaScript数据结构之二叉树的查找算法示例
Apr 13 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
Aug 03 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
Sep 19 #Javascript
Javascript中将变量转换为字符串的三种方法
Sep 19 #Javascript
详解JS中的this、apply、call、bind(经典面试题)
Sep 19 #Javascript
JavaScript 中的 this 简单规则
Sep 19 #Javascript
在 Node.js 中使用原生 ES 模块方法解析
Sep 19 #Javascript
Webpack 服务器端代码打包的示例代码
Sep 19 #Javascript
原生js中ajax访问的实例详解
Sep 19 #Javascript
You might like
怎样才能成为PHP高手?学会“懒惰”的编程
2006/12/05 PHP
php中看实例学正则表达式
2006/12/25 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
PHPMailer发送邮件
2016/12/28 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
Python request中文乱码问题解决方案
2020/09/17 Python
基于Python实现天天酷跑功能
2021/01/06 Python
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
路政管理专业推荐信
2013/11/11 职场文书
护士实习生自我鉴定范文
2013/12/10 职场文书
函授大学生自我鉴定
2014/02/05 职场文书
《欢乐的泼水节》教学反思
2014/04/22 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python