" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

手把手教你用Javascript實(shí)現(xiàn)觀察者模式

 更新時間:2021年12月02日 16:44:11   作者:1900's 88 keys  
這篇文章主要為大家介紹了Javascript觀察者模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

什么是觀察者模式?

  • 觀察者模式一種設(shè)計模式。
  • 觀察者模式定義了對象間的一種 一對多 的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都將得到通知,并自動更新。
  • 簡單說明,在觀察者模式中,有兩個模型,一個觀察者(observer)和一個被觀察者(Observed)。當(dāng)被觀察者發(fā)生改變或變化時,會通知觀察者。

場景模擬

  • 倘若即將到來雙11,想要在雙11購買商品的人就是觀察者(Observer)
  • 想要購買的商品就是被觀察者(Observed)
  • 為了更加形象,添加一個商家來改變商品的價格,商家也就是發(fā)布者(Publish)
  • 當(dāng)雙11當(dāng)天,商家(發(fā)布者(Publish))會修改商品(被觀察者(Observed))的價格,然后關(guān)注訂閱該商品的人(觀察者(Observer))就會收到信息通知。

在這里插入圖片描述

代碼實(shí)現(xiàn)

//觀察者設(shè)計模式
//發(fā)布者 -->商家
var shopObj = {};
//商品列表 [key:[]], key為商品名
shopObj.list = [];
//訂閱方法
shopObj.listen = function ( key, fn) {// key是商品型號, fn這個函數(shù)就是訂閱的行為
    if (!this.list[key]) {
        this.list[key] = [];
    }
    this.list[key].push(fn);//往商品名為key的商品列表中添加訂閱
}
//發(fā)布消息方法
shopObj.publish = function (key) {
    //var key = arguments[0];//如果不傳參數(shù)key,這樣也可以
    var fns = this.list[key];
    // for (var i = 0; i < fns.length; i++) {
        for(var i = 0 ,fn; fn = fns[i++];){
        //執(zhí)行訂閱的函數(shù)fn  arguemnts儲存的所有實(shí)參
        // var fn = fns[i++];
        fn.apply(this, arguments)
    }
}
//A用戶添加訂閱
shopObj.listen("華為", function (brand, model) {
    console.log( "A用戶收到:" + brand + model + "手機(jī)降價了");
})
//B用戶添加訂閱
shopObj.listen("華為", function (brand, model) {
    console.log("B用戶收到:" + brand + model + "手機(jī)降價了");
})
//c用戶添加訂閱
shopObj.listen("小米", function (brand, model) {
    console.log("C用戶收到:" + brand + model + "手機(jī)降價了");
})
//雙11 商家發(fā)布消息華為降價的信息
shopObj.publish("華為", "p30");
shopObj.publish("小米", "Mix4");

在這里插入圖片描述

重構(gòu)代碼

//觀察者設(shè)計模式
var Eevent = {
    //商品列表 [key:[]], key為商品名
    list: [],
    //訂閱方法
    listen: function (key, fn) {// key是商品型號, fn這個函數(shù)就是訂閱的行為
        if (!this.list[key]) {
            this.list[key] = [];
        }
        this.list[key].push(fn);
    },
    //發(fā)布消息方法
    publish: function (key) {
        //var key = arguments[0];//如果不傳參數(shù)key,這樣也可以
        var fns = this.list[key];
        // for (var i = 0; i < fns.length; i++) {
        for (var i = 0, fn; fn = fns[i++];) {
            //執(zhí)行訂閱的函數(shù)fn  arguemnts儲存的所有實(shí)參
            // var fn = fns[i++];
            fn.apply(this, arguments)
        }
    }
}
//觀察者對象初始化
var initEvent = function (obj) {
    for (var i in Eevent) {
        obj[i] = Eevent[i];
    }
}
//發(fā)布者 -->商家
var shopObj = {};
initEvent(shopObj);
//A用戶添加訂閱
shopObj.listen("華為", function (brand, model) {
    console.log("A用戶收到:" + brand + model + "手機(jī)降價了");
})
//B用戶添加訂閱
shopObj.listen("華為", function (brand, model) {
    console.log("B用戶收到:" + brand + model + "手機(jī)降價了");
})
//c用戶添加訂閱
shopObj.listen("小米", function (brand, model) {
    console.log("C用戶收到:" + brand + model + "手機(jī)降價了");
})
//雙11 商家發(fā)布消息華為降價的信息
shopObj.publish("華為", "p30");
shopObj.publish("小米", "Mix4");

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • js防止表單重復(fù)提交實(shí)現(xiàn)代碼

    js防止表單重復(fù)提交實(shí)現(xiàn)代碼

    重復(fù)提交、重復(fù)刷新、防止后退等等都是屬于系統(tǒng)為避免重復(fù)記錄而需要解決的問題,在客戶端去處理需要針對每一種的可能提出相應(yīng)的解決方案,然而在服務(wù)器端看來只不過是對于數(shù)據(jù)真實(shí)性的檢驗(yàn)問題
    2012-09-09
  • 微信小程序?qū)崿F(xiàn)上拉加載功能

    微信小程序?qū)崿F(xiàn)上拉加載功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)上拉加載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • JavaScript中new操作符的原理示例詳解

    JavaScript中new操作符的原理示例詳解

    javascript中的new是一個語法糖,new的過程實(shí)際上是創(chuàng)建一個新對象,把新象的原型設(shè)置為構(gòu)造器函數(shù)的原型,這篇文章主要給大家介紹了關(guān)于JavaScript中new操作符原理的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • React Native登錄之指紋登錄篇的示例代碼

    React Native登錄之指紋登錄篇的示例代碼

    這篇文章主要介紹了React Native登錄之指紋登錄篇,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • js前端解決跨域的八種實(shí)現(xiàn)方案

    js前端解決跨域的八種實(shí)現(xiàn)方案

    這篇文章主要介紹了js前端解決跨域的八種實(shí)現(xiàn)方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • web前端開發(fā)upload上傳頭像js示例代碼

    web前端開發(fā)upload上傳頭像js示例代碼

    這篇文章主要為大家詳細(xì)介紹了web前端開發(fā)upload上傳頭像js示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 前端排查內(nèi)存泄漏的方法及實(shí)戰(zhàn)案例

    前端排查內(nèi)存泄漏的方法及實(shí)戰(zhàn)案例

    內(nèi)存泄漏是指在程序運(yùn)行時,分配的內(nèi)存沒有被正確釋放,導(dǎo)致內(nèi)存空間的浪費(fèi),最終可能會導(dǎo)致程序崩潰或運(yùn)行緩慢,這篇文章主要介紹了前端排查內(nèi)存泄漏的相關(guān)資料,需要的朋友可以參考下
    2025-03-03
  • 一篇文章教你用JavaScript使用流程控制打印九九乘法表

    一篇文章教你用JavaScript使用流程控制打印九九乘法表

    這篇文章主要為大家詳細(xì)介紹了JavaScript使用流程控制打印九九乘法表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • D3.js實(shí)現(xiàn)餅圖,環(huán)圖,玫瑰圖的繪制

    D3.js實(shí)現(xiàn)餅圖,環(huán)圖,玫瑰圖的繪制

    這篇文章主要為大家介紹了如何利用D3.js中的d3.pie和d3.arc實(shí)現(xiàn)餅圖、環(huán)圖和玫瑰圖的繪制,文中的實(shí)現(xiàn)方法講解詳細(xì),感興趣的可以嘗試一下
    2022-11-11
  • JavaScript常用驗(yàn)證函數(shù)實(shí)例匯總

    JavaScript常用驗(yàn)證函數(shù)實(shí)例匯總

    這篇文章主要介紹了JavaScript常用驗(yàn)證函數(shù),實(shí)例匯總了如字符串驗(yàn)證、表單驗(yàn)證及js常用特效等諸多js常用驗(yàn)證函數(shù)及相關(guān)技巧,非常具有實(shí)用價值,需要的朋友可以參考下
    2014-11-11

最新評論

祥云县| 扎鲁特旗| 吐鲁番市| 文化| 灵石县| 五常市| 峨眉山市| 黄陵县| 徐闻县| 四平市| 昌黎县| 望奎县| 平凉市| 雅江县| 长葛市| 商洛市| 乐都县| 石屏县| 义乌市| 苏尼特左旗| 新丰县| 逊克县| 仁寿县| 定西市| SHOW| 乡城县| 错那县| 辽阳市| 平乐县| 铁力市| 虹口区| 宁国市| 苏尼特左旗| 盘山县| 石家庄市| 精河县| 富顺县| 庆城县| 德庆县| 双城市| 阿克|