js設(shè)計(jì)模式-觀察者模式(3)

基本觀察者模式

以下Observer為觀察者使碾,當(dāng)state改變時(shí)通知觀察者底洗。addObserver進(jìn)行訂閱,this.observers中儲(chǔ)存了所有的觀察者智蝠。notify時(shí)對(duì)觀察者進(jìn)行通知腾么。

class Subject{
    constructor(){
        this.state="init"
        this.observers=[]
    }

    setState(state){//修改狀態(tài)并通知觀察者
        this.state=state
        this.notify(state)
    }

    notify(state){//通知
        this.observers.forEach(observer=>observer.getNewState(state))
    }

    addObserver(observer){//訂閱
        this.observers.push(observer)
    }
}
class Observer{
    getNewState(state){
        console.log(`new state is: ${state}`)
    }
}
const sub=new Subject()
const observer1=new Observer()
const observer2=new Observer()
sub.addObserver(observer1)//new state is: next state
sub.addObserver(observer2)//new state is: next state
sub.setState("next state")

node中EventEmitter模塊實(shí)現(xiàn)

參考: 循序漸進(jìn)教你實(shí)現(xiàn)一個(gè)完整的node的EventEmitter模塊
EventEmitter的使用方式:
.on(type,function)設(shè)置監(jiān)聽事件的名稱,.emit(type,args)觸發(fā)事件杈湾,傳遞參數(shù)

var events=require('events');
var eventEmitter=new events.EventEmitter();
eventEmitter.on('say',function(name){
    console.log('Hello',name);
})
eventEmitter.emit('say','Jony yu');

EventEmitter的基本實(shí)現(xiàn):handler儲(chǔ)存所有的事件解虱,key為事件名稱。value為數(shù)組漆撞,數(shù)組中儲(chǔ)存監(jiān)聽的function

handler:{
  click:[],
change:[]
}
class EventEmitter{
    constructor(){
        this.handler={}
    }
    on(type,fn){
        //第一次添加對(duì)應(yīng)type-初始化
        !this.handler[type]&&(this.handler[type]=[])
        this.handler[type].push(fn)
    }
    emit(type,args){
        if(!this.handler[type])
        {
            console.log(`did not add listener : ${type}`)
            return null
        }else {
            this.handler[type].forEach(fn=>fn(args))
        }

    }
}
let event=new EventEmitter();
event.on('say',function(str){
    console.log(str);
});
event.emit('say','hello Jony yu');
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末殴泰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子浮驳,更是在濱河造成了極大的恐慌悍汛,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件至会,死亡現(xiàn)場(chǎng)離奇詭異离咐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奉件,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門宵蛀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昆著,“玉大人,你說我怎么就攤上這事糖埋⌒ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵瞳别,是天一觀的道長(zhǎng)征候。 經(jīng)常有香客問我,道長(zhǎng)祟敛,這世上最難降的妖魔是什么疤坝? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮馆铁,結(jié)果婚禮上跑揉,老公的妹妹穿的比我還像新娘。我一直安慰自己埠巨,他們只是感情好历谍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辣垒,像睡著了一般望侈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勋桶,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天脱衙,我揣著相機(jī)與錄音,去河邊找鬼例驹。 笑死捐韩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹃锈。 我是一名探鬼主播荤胁,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼屎债!你這毒婦竟也來了仅政?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤扔茅,失蹤者是張志新(化名)和其女友劉穎已旧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體召娜,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡运褪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秸讹。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡檀咙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出璃诀,到底是詐尸還是另有隱情弧可,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布劣欢,位于F島的核電站棕诵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凿将。R本人自食惡果不足惜校套,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牧抵。 院中可真熱鬧笛匙,春花似錦、人聲如沸犀变。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽获枝。三九已至蠢正,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間映琳,已是汗流浹背机隙。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工蜘拉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萨西,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓旭旭,卻偏偏與公主長(zhǎng)得像谎脯,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子持寄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容