NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】


Posted in NodeJs onSeptember 06, 2017

本文实例讲述了NodeJS设计模式。分享给大家供大家参考,具体如下:

1 . 单例模式

顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直接返回,若不存在,则创建实例对象,并将实例对象保存在静态变量中,当下次请求时,则可以直接返回这个对象实例,这就确保了一个类只有一个实例对象。举个例子吧~一间学校刚刚起建还没有图书馆,有的同学就向领导提意见:"hey! 哥们,能不能帮我们建一个图书馆? "(想要一个图书馆实例),然后领导说:"no problem啊!等我一下,马上建给你"(实例还没有建立,便创建一个)。几个月后,图书馆建好了~有位奇葩同学也想去图书馆,他却向领导提出要求: "hey! 哥们,我想去图书馆,能不能帮我建一个?"然后领导说: "no problem个头阿!那边已经建好了一个,你去那间不就可以了吗!"(当实例已经存在的时候,则直接返回已经创建的实例)

/*singleInstance.js*/
var _instance = null;//定义初始化_instance
module.exports = function(time){
   function Car(time){
     this.time = time;
   }
   this.getInstance = function(){
     if(_instance != null){
       return _instance;
     }else{
       return new Car(time);
     }
   }
}

2. 适配器模式

若将一个类的接口转换为客户希望的另外一个接口,适配器模式可以使原本由于接口不兼容而不能一起工作的那些类可以一起工作。举个例子吧~小明的老爸大明很爱喝白酒,但是呢喝酒又伤身,小明看到便不忍心,于是他想了方法:把白酒瓶子里面的酒倒掉,换成了白开水(重写内容)。大明看到还是那个酒瓶就没太在意(接口没有改变,只是内容改变了),一口气就把"酒"喝完了,还很高兴~(此处假设大明智商比较低..)。因此支配器是一个既不得罪他人,也能达到自己目的的一个好方法~下面是具体的实现方法

/*target.js*/
module.exports = function(){
  this.request = function(){//原接口
    console.log('Target::request');
  }
}
/*adapter.js*/
var util = require('util');
var Target = require('./target.js');
var Adaptee = require('./adaptee.js');
function Adapter(){
  Target.call(this);
  this.request = function(){//重写原接口
    var adapteeObj = new Adaptee();//重写的内容
    adapteeObj.specialRequest();
  }
}
util.inherits(Adapter, Target);//通过继承原模块, 获得原接口
module.exports = Adapter;

3. 装饰模式

装饰模式可以通过继承的方式,为一个基类对象扩展功能。举个例子吧~一颗圣诞树,一开始什么都没有。然后Amy看到之后往树上挂了几个饰品(扩展原来的基类),然后Billy路过之后,觉得它还差点什么,就把圣诞树拿过来(继承),然后也往上面放点其他饰品(继续扩展)。

/*Base.js*/
module.exports = function(){
  this.dosomething = function(){
   console.log("Nice to meet u.");
  }
}
/*Decorator.js*/
var util = require("util);
var Base = require('./Base');
function Decorator(){
  Base.call(this);
  this.dosomething = function(){
     Base.dosomething();
     console.log('I am a decorator');//拓展内容
  }
}
util.inherits(Decorator, Base);//继承
module.exports = Decorator;

4. 观察者模式

什么是观察者模式呢?举个例子吧~小狗同学和小熊同学同时喜欢上了班里可爱的小兔同学。小狗和小熊都会注意着小兔的一举一动,只有小兔有什么动静他们两个都会知道~相对而言呢,小狗和小熊就是小兔的"观察者",而小兔呢就是"被观察的对象"。比较重要的是:小兔发生的动静(某个函数),会同时通知到观察者小狗和小熊,让他们两个也会做出相应的反馈(各自的回调函数)

/*被观察者*/
module.exports = function(){
  var m_obserSet = [];//观察者列表
  var _self = this;
  this.addObser = function(observer){
    m_obserSet.push(observer);//添加观察者
  }
  this.doAction = function(){
    console.log("Observable do some action");
    _self.notifyAllObeser();
  }
  this.notifyAllObeser = function(){//发生动作
    for(var key in m_obserSet){//逐个通知观察者
      m_obserSet[key].update();//观察者执行回调
    }
  }
}

希望本文所述对大家nodejs程序设计有所帮助。

NodeJs 相关文章推荐
将nodejs打包工具整合到鼠标右键的方法
May 11 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
nodejs创建web服务器之hello world程序
Aug 20 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
nodejs6下使用koa2框架实例
May 18 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
Sep 04 #NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 #NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 #NodeJs
NodeJS收发GET和POST请求的示例代码
Aug 25 #NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 #NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 #NodeJs
使用Nodejs连接mongodb数据库的实现代码
Aug 21 #NodeJs
You might like
php木马攻击防御之道
2008/03/24 PHP
计算一段日期内的周末天数的php代码(星期六,星期日总和)
2009/11/12 PHP
PHP $_FILES函数详解
2011/03/09 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
2021/02/26 PHP
TBCompressor js代码压缩
2011/01/05 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
js数组去重的方法总结
2019/01/18 Javascript
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
python操作gitlab API过程解析
2019/12/27 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
英国假睫毛购买网站:FalseEyelashes.co.uk
2018/05/23 全球购物
乔迁宴答谢词
2014/01/21 职场文书
教育科研先进个人材料
2014/01/26 职场文书
构建高效课堂实施方案
2014/03/13 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL