溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

NodeJS設(shè)計(jì)模式總結(jié)【單例模式,適配器模式,裝飾模式,觀察者模式】

發(fā)布時(shí)間:2020-08-21 03:08:03 來(lái)源:腳本之家 閱讀:303 作者:lucky芬 欄目:web開(kāi)發(fā)

本文實(shí)例講述了NodeJS設(shè)計(jì)模式。分享給大家供大家參考,具體如下:

1 . 單例模式

顧名思義,單例就是保證一個(gè)類(lèi)只有一個(gè)實(shí)例,實(shí)現(xiàn)的方法是,先判斷實(shí)例是否存在,如果存在則直接返回,若不存在,則創(chuàng)建實(shí)例對(duì)象,并將實(shí)例對(duì)象保存在靜態(tài)變量中,當(dāng)下次請(qǐng)求時(shí),則可以直接返回這個(gè)對(duì)象實(shí)例,這就確保了一個(gè)類(lèi)只有一個(gè)實(shí)例對(duì)象。舉個(gè)例子吧~一間學(xué)校剛剛起建還沒(méi)有圖書(shū)館,有的同學(xué)就向領(lǐng)導(dǎo)提意見(jiàn):"hey! 哥們,能不能幫我們建一個(gè)圖書(shū)館? "(想要一個(gè)圖書(shū)館實(shí)例),然后領(lǐng)導(dǎo)說(shuō):"no problem啊!等我一下,馬上建給你"(實(shí)例還沒(méi)有建立,便創(chuàng)建一個(gè))。幾個(gè)月后,圖書(shū)館建好了~有位奇葩同學(xué)也想去圖書(shū)館,他卻向領(lǐng)導(dǎo)提出要求: "hey! 哥們,我想去圖書(shū)館,能不能幫我建一個(gè)?"然后領(lǐng)導(dǎo)說(shuō): "no problem個(gè)頭阿!那邊已經(jīng)建好了一個(gè),你去那間不就可以了嗎!"(當(dāng)實(shí)例已經(jīng)存在的時(shí)候,則直接返回已經(jīng)創(chuàng)建的實(shí)例)

/*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. 適配器模式

若將一個(gè)類(lèi)的接口轉(zhuǎn)換為客戶(hù)希望的另外一個(gè)接口,適配器模式可以使原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。舉個(gè)例子吧~小明的老爸大明很愛(ài)喝白酒,但是呢喝酒又傷身,小明看到便不忍心,于是他想了方法:把白酒瓶子里面的酒倒掉,換成了白開(kāi)水(重寫(xiě)內(nèi)容)。大明看到還是那個(gè)酒瓶就沒(méi)太在意(接口沒(méi)有改變,只是內(nèi)容改變了),一口氣就把"酒"喝完了,還很高興~(此處假設(shè)大明智商比較低..)。因此支配器是一個(gè)既不得罪他人,也能達(dá)到自己目的的一個(gè)好方法~下面是具體的實(shí)現(xiàn)方法

/*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(){//重寫(xiě)原接口
    var adapteeObj = new Adaptee();//重寫(xiě)的內(nèi)容
    adapteeObj.specialRequest();
  }
}
util.inherits(Adapter, Target);//通過(guò)繼承原模塊, 獲得原接口
module.exports = Adapter;

3. 裝飾模式

裝飾模式可以通過(guò)繼承的方式,為一個(gè)基類(lèi)對(duì)象擴(kuò)展功能。舉個(gè)例子吧~一顆圣誕樹(shù),一開(kāi)始什么都沒(méi)有。然后Amy看到之后往樹(shù)上掛了幾個(gè)飾品(擴(kuò)展原來(lái)的基類(lèi)),然后Billy路過(guò)之后,覺(jué)得它還差點(diǎn)什么,就把圣誕樹(shù)拿過(guò)來(lái)(繼承),然后也往上面放點(diǎn)其他飾品(繼續(xù)擴(kuò)展)。

/*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');//拓展內(nèi)容
  }
}
util.inherits(Decorator, Base);//繼承
module.exports = Decorator;

4. 觀察者模式

什么是觀察者模式呢?舉個(gè)例子吧~小狗同學(xué)和小熊同學(xué)同時(shí)喜歡上了班里可愛(ài)的小兔同學(xué)。小狗和小熊都會(huì)注意著小兔的一舉一動(dòng),只有小兔有什么動(dòng)靜他們兩個(gè)都會(huì)知道~相對(duì)而言呢,小狗和小熊就是小兔的"觀察者",而小兔呢就是"被觀察的對(duì)象"。比較重要的是:小兔發(fā)生的動(dòng)靜(某個(gè)函數(shù)),會(huì)同時(shí)通知到觀察者小狗和小熊,讓他們兩個(gè)也會(huì)做出相應(yīng)的反饋(各自的回調(diào)函數(shù))

/*被觀察者*/
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(){//發(fā)生動(dòng)作
    for(var key in m_obserSet){//逐個(gè)通知觀察者
      m_obserSet[key].update();//觀察者執(zhí)行回調(diào)
    }
  }
}

希望本文所述對(duì)大家nodejs程序設(shè)計(jì)有所幫助。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI