深入理解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 相关文章推荐
jquery与google map api结合使用 控件,监听器
Mar 04 Javascript
使用apply方法处理数组的三个技巧[译]
Sep 20 Javascript
使用js检测浏览器的实现代码
May 14 Javascript
js对文章内容进行分页示例代码
Mar 05 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
Dec 29 Javascript
js父页面中使用子页面的方法
Jan 09 Javascript
js实现select选择框效果及美化
Aug 19 Javascript
React学习笔记之列表渲染示例详解
Aug 22 Javascript
微信小程序实现手势图案锁屏功能
Jan 30 Javascript
在Vue中使用highCharts绘制3d饼图的方法
Feb 08 Javascript
Vue商品控件与购物车联动效果的实例代码
Jul 21 Javascript
MockJs结合json-server模拟后台数据
Aug 26 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/07/08 PHP
不错的一篇面向对象的PHP开发模式(简写版)
2007/03/15 PHP
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
phplot生成图片类用法详解
2015/01/06 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
php模板引擎技术简单实现
2016/03/15 PHP
原生js实现查找/添加/删除/指定元素的class
2013/04/12 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
jQuery学习笔记之基础中的基础
2015/01/19 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
js断点调试经验分享
2017/12/08 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
haskell实现多线程服务器实例代码
2013/11/26 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
python实现猜数游戏
2020/03/27 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
服务中心夜班服务员岗位职责
2013/11/27 职场文书
公司年会抽奖活动主持词
2014/03/31 职场文书
借款协议书范本
2014/04/22 职场文书
责任胜于能力演讲稿
2014/05/20 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
超强台风观后感
2015/06/09 职场文书
PostgreSQL将数据加载到buffer cache中操作方法
2021/04/16 PostgreSQL