關(guān)于vue的觀察者模式的淺析

眾所周知,vue2.x中的雙向綁定是通過Object.defineproperty 來劫持各個屬性的 setter,getter,在數(shù)據(jù)變動時發(fā)布消息給訂閱者,觸發(fā)響應(yīng)的監(jiān)聽回調(diào),其中的核心類發(fā)布者Dep和觀察者Watcher就是通過觀察者模式實(shí)現(xiàn)的。
在觀察者模式Dep中有幾個屬性,subs是存放收集來的觀察者對象,addSub方法用來進(jìn)行依賴收集,然后調(diào)用notify方法下發(fā)通知,調(diào)用Watcher對象下的update方法

//發(fā)布者(目標(biāo))
class Dep {
    constructor() {
       //存放觀察者對象
        this.subs = []
    }
    addSubs(sub) {
        //判斷參數(shù)是否存在,且收集來的觀察者需要有
        if (sub && sub.update) {
        //將觀察者對象添加到subs屬性下
            this.subs.push(sub)
        }
    }
    notify() {
        //在調(diào)用notify方法時下發(fā)同時,觸發(fā)subs中每個觀察者對象的update方法來觸發(fā)更新
        this.subs.forEach(sub => {
            sub.update()
        })
    }
};

觀察者對象Watcher下需要有一個update方法,這里可以做一些事情,用來更新數(shù)據(jù)等操作

// 觀察者(訂閱者)
class Watcher {
    update() {
        console.log('update')
    }
};
const dep = new Dep();
const watcher = new Watcher();

簡單做下測試

const dep = new Dep();
const watcher = new Watcher();
dep.addSubs(watcher);
dep.notify();//調(diào)用Watcher下的update方法,打印出一個'update'

對比觀察者模式跟發(fā)布訂閱模式


觀察者.png

總結(jié)下:

  • 觀察者模式有具體的目標(biāo)調(diào)度,比如當(dāng)事件觸發(fā),Dep就會調(diào)用觀察者的方法,所以觀察者模式的訂閱者和發(fā)布者是存在依賴的。
  • 發(fā)布/訂閱模式是由統(tǒng)一的調(diào)度中心調(diào)用,因此發(fā)布者和訂閱者不需要知道對方的存在
    關(guān)于發(fā)布/訂閱模式的淺析在這里發(fā)布/訂閱模式淺析

還在學(xué)習(xí)路上,如果有錯誤之處也希望能得到指點(diǎn)

年華如果虛度,生命將毫無意義
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容