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的10个性能优化技巧
Jul 15 NodeJs
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
详解nodejs与javascript中的aes加密
May 22 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
nodejs基础知识
Feb 03 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
node快速搭建后台的实现步骤
Feb 18 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
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
jquery中$each()方法的使用指南
2015/04/30 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
jQuery选择器之层次选择器用法实例分析
2019/02/19 jQuery
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
Python socket服务常用操作代码实例
2020/06/22 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
莫斯科大型旅游休闲商品超市:Camping.ru
2020/09/16 全球购物
物理教师自荐信范文
2013/12/28 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
民事答辩状格式范文
2015/05/21 职场文书
2016大学生国家助学贷款承诺书
2016/03/25 职场文书
Shell脚本一键安装Nginx服务自定义Nginx版本
2022/03/20 Servers
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby