OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

Node.js中的通用基础设计模式


分享到
分类 JS学习   关键字 Node.JS   发布 ourjs  1437120909103
注意 转载须保留原文链接,译文链接,作者译者等信息。  
谈到设计模式,你可能会想到 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);
});



原文地址: 点此
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 我是怎么从顾虑到热爱ReactJS的(与AngularJS经典MVC数据绑定的对比)
  2. 几款开源的图形化Redis客户端管理软件
  3. JavaScript中的哈希表(Hash Maps的最佳实践)
  4. JSON序列化(stringify)对象时排除某些属性的两种方法
  5. WowJS:在滚动页面时添加动画效果的简单实现
  6. LightGL轻量级的WebGL 3D渲染库
  7. JSGraphs目前最全的JavaScrtip开源图表库集合
  8. [PPT]JavaScript初级教程
  9. 闪客时代开始被HTML5慢慢终结:Facebook首席安全官号召设定正式消灭Flash的期限
  10. 在Debian/Ubuntu上面安装升级nginx到最新版
  11. AirJD-简单好用的免费建站工具

 相关阅读 - JS学习
  1. WowJS:在滚动页面时添加动画效果的简单实现
  2. [PPT]JavaScript初级教程
  3. JavaScript中的哈希表(Hash Maps的最佳实践)
  4. 我是怎么从顾虑到热爱ReactJS的(与AngularJS经典MVC数据绑定的对比)
  5. JSON序列化(stringify)对象时排除某些属性的两种方法
  6. JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识
  7. 用jQuery为跳转链接锚点添加平滑滚动动画效果(如回到顶部按钮)
  8. 用纯css改变下拉列表select框的默认样式
  9. Atom编辑器嵌入Node.JS引擎实践
  10. AngularJS和$scope.$apply()用法的最佳实践

 关键字 - Node.JS
  1. node.js中fs.stat里的atime,mtime,ctime,birthtime在debian下的更新规则与区别
  2. NodeJS的DNS使用:域名解析,MX记录查询,SPF反垃圾邮件测试
  3. 在nodejs中使用Redis缓存和查询数据及Session持久化(Express)
  4. 是什么让Node.js比Java更快?为什么NodeJS这么快?
  5. 用纯Node.JS弹出Windows系统消息提示框(MessageBox)
  6. 利用Windows注册表将你的Node.JS程序添加到右健菜单直接运行
  7. Node.js中的通用基础设计模式
  8. Node.JS中如何判断递归嵌套的所有回调函数已经执行完毕,以读取目录下所有文件为例:计数比Promise方式快将近一倍
  9. Node.js网页抓取:一个最简单的http请求客户端示例(request client)
  10. 6款基于Node.JS的开源内容管理和静态网站生成系统

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号