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基本语法和类型
Feb 13 NodeJs
使用NodeJs 开发微信公众号(三)微信事件交互实例
Mar 02 NodeJs
Windows 系统下设置Nodejs NPM全局路径
Apr 26 NodeJs
Nodejs+Socket.io实现通讯实例代码
Feb 13 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
Jan 29 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
nodejs使用socket5进行代理请求的实现
Feb 21 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
声音就能俘获人心,蕾姆,是哪个漂亮小姐姐配音呢?
2020/03/03 日漫
php 缓存函数代码
2008/08/27 PHP
一个很不错的PHP翻页类
2009/06/01 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
2011/09/20 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
Vue2递归组件实现树形菜单
2017/04/10 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
Python获取央视节目单的实现代码
2015/07/25 Python
Python中字符串的处理技巧分享
2016/09/17 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
Python查看微信撤回消息代码
2018/06/07 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
校园奶茶店创业计划书
2014/01/23 职场文书
美术教师自我鉴定
2014/02/12 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
在职人员跳槽求职信
2015/03/20 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL