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

觀察者模式

觀察者模式是一種對(duì)象行為模式,它定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)被觀察者狀態(tài)發(fā)生改變時(shí),所有的觀察者都得到通知并自動(dòng)更新.

  • 圖例


    image.png
  • 代碼實(shí)現(xiàn)

class Baby{
    constructor(){
        this.observes=[];
        this.status='';
    }
    attach(...watcher){
        this.observes.push(...watcher)
    }
    chageStatus(){
        this.status='寶寶哭啦'
        if(this.observes.length){
            this.observes.forEach(fn=>{fn.update(this.status)})
        }
    }
}

class Father{
    update(status){
        return console.log(`爸爸知道${status}`)
    }
}
class Mather{
    update(status){
        return console.log(`媽媽知道${status}`)
    }
}
let baby=new Baby();
baby.attach(new Father,new Mather);
baby.chageStatus() //爸爸知道寶寶哭啦 媽媽知道寶寶哭啦
  • 應(yīng)用場(chǎng)景

1.普通事件綁定

<button id="btn">按鈕</button>

let btn=document.querySelector("#btn");

btn.addEventListener('click',function(event){
    console.log(event)
})
  1. promise
let promise=new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve(11111)
    },1000)
})

promise.then(res=>{
   console.log(res)
}).catch(err=>{
   console.log(err)
})

3.jquery Callbacks

let $={
    Callbacks(){
        let callbacks=[]
        function add(fn){
            callbacks.push(fn)
        }
        function remove(fn){
            callbacks=callbacks.filter(item=>item!=fn)
        }
        function fire(){
            callbacks.forEach(item=>item())
        }
        return{
            add,
            remove,
            fire
        }
    }
}
let callbacks=$.Callbacks();
function a1(){
    console.log('a1')
}
function a2(){
    console.log('a2')
}
function a3(){
    console.log('a3')
}
callbacks.add(a1)
callbacks.add(a2)
callbacks.add(a3)
callbacks.remove(a2)
callbacks.fire()  //a1 a3
  1. node events
let EvenetEmitter=require('events');
let eve=new EvenetEmitter();
eve.on('click',function(name){
    console.log(name) //zdb
})

eve.emit('click','zdb')
  1. fs createReadStrema
let fs=require('fs');
let path=require('path');
let rs=fs.createReadStream(path.join(__dirname,'1.txt'))
rs.on('data',function(data){
    console.log(data)
})
rs.on('end',function(){
    console.log('end')
})

6.vue watch

   watch: {
        $route(to, from) {
           console.log(to,from)
        }
    }

7.vuex 官網(wǎng)示例

優(yōu)點(diǎn) 缺點(diǎn)
觀察者模式解除了主題和具體觀察者的耦合,讓耦合的雙方都依賴于抽象,而不依賴于具體. 1毅往、如果一個(gè)被觀察者對(duì)象有很多的直接和間接的觀察者的話牵咙,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。 2攀唯、如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話洁桌,觀察目標(biāo)會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰侯嘀。 3另凌、觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對(duì)象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化戒幔。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吠谢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子诗茎,更是在濱河造成了極大的恐慌工坊,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異王污,居然都是意外死亡罢吃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門昭齐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尿招,“玉大人,你說我怎么就攤上這事阱驾【兔眨” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵里覆,是天一觀的道長丧荐。 經(jīng)常有香客問我,道長租谈,這世上最難降的妖魔是什么篮奄? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任捆愁,我火速辦了婚禮割去,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昼丑。我一直安慰自己呻逆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布菩帝。 她就那樣靜靜地躺著咖城,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呼奢。 梳的紋絲不亂的頭發(fā)上宜雀,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音握础,去河邊找鬼辐董。 笑死,一個(gè)胖子當(dāng)著我的面吹牛禀综,可吹牛的內(nèi)容都是我干的简烘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼定枷,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼孤澎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起欠窒,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤覆旭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體型将,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡絮供,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茶敏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壤靶。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惊搏,靈堂內(nèi)的尸體忽然破棺而出贮乳,到底是詐尸還是另有隱情,我是刑警寧澤恬惯,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布向拆,位于F島的核電站,受9級(jí)特大地震影響酪耳,放射性物質(zhì)發(fā)生泄漏浓恳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一碗暗、第九天 我趴在偏房一處隱蔽的房頂上張望颈将。 院中可真熱鬧,春花似錦言疗、人聲如沸晴圾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽死姚。三九已至,卻和暖如春勤篮,著一層夾襖步出監(jiān)牢的瞬間都毒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工碰缔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留账劲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓手负,卻偏偏與公主長得像涤垫,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竟终,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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