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

怎樣用JavaScript實現(xiàn)觀察者模式

 更新時間:2021年04月26日 09:07:02   作者:有夢想的咸魚前端  
這篇文章主要介紹了怎樣用JavaScript實現(xiàn)觀察者模式,想學習設計模式的同學,可以參考一下

概述

觀察者模式又被稱為發(fā)布-訂閱模式,是設計模式中的一種行為型模式;

定義:

觀察者模式定義了一種一對多的對象依賴關系,當被依賴的對象的狀態(tài)發(fā)生了改變,所有依賴它的對象都會得到通知;

白話解釋:

假如你去蘋果專賣店買最新款的iphone11,因為iphone11剛出來不久,正處旺季,供貨不足;當你去專賣店的時候,店員告訴你暫時沒貨了,但是你可以留下你的聯(lián)系方式,如果貨到了,會第一時間通知;當然你肯定不會每天都去專賣店問iphone11到貨沒有,也不會天天給專賣店打電話,因為你有你自己的工作和生活,不可能有那么多閑暇時間;所以此時,店員讓你留下聯(lián)系方式,到貨了第一時間通知你,不會給你帶來麻煩,而你只需要等著專賣店的電話即可;而這種方法就是一種典型的觀察者模式;

首先我們還是來分析一下:

1.訂閱方法:我們把聯(lián)系方式給專賣店店員是屬于一種消息訂閱的消息,因為只有這樣你才能及時的知道iphone11到貨了,所有我們需要一個訂閱行為的具體方法;

2.預訂列表:要知道iphone11是屬于新版iphone,所以肯定不會是只有你一個人去預訂,所以店員為了方便統(tǒng)計還需要一個預訂列表來統(tǒng)計所有的預訂者的聯(lián)系方式以及預訂手機版本信息,所以我們這里先給它定義為一個對象;key代表是預訂者的聯(lián)系方式,value代表預訂手機版本信息;

3.發(fā)布方法:當iphone11到貨的時候,專賣店肯定要根據(jù)預訂列表來進行統(tǒng)一發(fā)布消息("iphone11到貨了,大家快來搶!??!"),所以專賣店需要一個發(fā)布方法來實行具體的發(fā)布行為;、

4.取消訂閱:萬物相對,能訂閱肯定就能取消訂閱;在等待iphone11到貨通知的時候,你急著用手機,所以直接買了華為的某款,所以iphone11暫時對你來說需求不大,因為你已經(jīng)有了手機所以專賣店的iphone11是否到貨對你來說沒有任何意義了;所以此時你不想被打擾,需要取消訂閱消息;所以我們需要一個取消訂閱方法來實現(xiàn)具體的取消訂閱的行為;

觀察者模式的應用場景

1、DOM事件

如果你是一個前端開發(fā)人員,不管你讀這篇文章之前是否已經(jīng)了解觀察者模式,但是我能肯定你已經(jīng)用過觀察者模式;

document.body.addEventListener('click', function() {
    console.log('hello world!');
});

這段代碼看著眼熟嗎?是的,這是一個DOM事件的監(jiān)聽;我們通過給body訂閱click事件(click相當于上面的訂閱方法),因為瀏覽器并不知道你什么時候點擊鼠標,所以等你觸發(fā)click事件的時候才會觸發(fā)函數(shù)給你發(fā)布通知(發(fā)布方法);DOM事件就是一個觀察者模式的實現(xiàn);

2、vue雙向綁定v-model

我們作為前端開發(fā)人員,肯定知道vue是一個MVVM模式的框架;vue的核心就是雙向綁定,那么雙向綁定的實現(xiàn)實際上就是一種觀察者模式;因為你首先綁定了一個數(shù)據(jù)之后(訂閱方法),瀏覽器并不知道你什么時候修改,你頁面上所有綁定了該數(shù)據(jù)或者依賴該數(shù)據(jù)的節(jié)點其實就是一個預訂列表,只有等你修改了該數(shù)據(jù)的值的時候,vue才會通知(發(fā)布方法)到依賴該數(shù)據(jù)的方法/數(shù)據(jù)進行相應的操作或刷新;

當然觀察者模式絕不僅限于這倆種實現(xiàn)場景,在我們的生活中、業(yè)務場景中有很多觀察者模式的示例,之前我們第一篇工廠模式介紹設計模式的時候就說過了,設計模式是一種解決問題的思路而非一種固定的公式,那么我們怎么實現(xiàn)觀察者模式呢?

觀察者模式的實現(xiàn)

//定義商家
var merchants = {};
//定義預訂列表
merchants.orderList = {};
//將增加的預定者添加到預訂列表中   (訂閱方法)
merchants.listen = function(id,info){
    //如果存在
    if(!this.orderList[id]){
        // (預訂列表)
        this.orderList[id] = [];
    }
    // 將用戶的預定的產(chǎn)品信息存入到數(shù)組中
    this.orderList[id].push(info);
}
//發(fā)布信息(發(fā)布方法)
merchants.publish = function(){
    var id = Array.prototype.shift.call(arguments);
    var infos = this.orderList[id];
    if(!infos || infos.length === 0){
        console.log("您還沒有預定信息");
        return false;
    }

    for(var i = 0;i < infos.length;i++){
        console.log("預定成功");
        console.log("尊敬的用戶:")
        infos[i].apply(this,arguments);
        console.log("到貨了");
    }
}
//取消訂閱  
merchants.remove = function(id,fn){
    var infos = this.orderList[id];
    if(!infos){ return false}

    if(!fn){
        console.log(123);
    }else{
        for(var i = 0;i < infos.length;i++){
            if(infos[i] === fn){
                infos.splice(i,1);
            }
        }
    }
}
let customeA = function(){
    console.log("黑色尊享版一臺");
}

merchants.listen("15172103336",customeA);
merchants.remove("15172103336",customeA);
merchants.publish("15172103336");

上面的代碼稍微有點長,不過沒有很難;首先我們是定義了一個對象是作為商家,然后定義了一個空的對象作為預訂列表,再一步步的實現(xiàn)我們的訂閱方法和發(fā)布以及取消訂閱的方法;邏輯不復雜,但是有一些語法需要講解一下:

發(fā)布方法中的var id = Array.prototype.shift.call(arguments);這句的意思是將merchants.publish("15172103336");方法調(diào)用的時候第一個參數(shù)返回給它然后復制為id,所以其實此時的id值為”15172103336“;

infos[i].apply(this,arguments);這個方法也不是特別好理解,首先infos里裝的是預訂者的手機號碼以及手機版本信息,所以我們infos[i].apply(this,arguments);這個方法其實就是將"15172103336"對應的手機版本信息函數(shù)進行調(diào)用了一遍;實際上等于infos[i](arguments);

總結

觀察者模式不管是在前端領域還是在現(xiàn)實生活中的應用都是有很常見的場景,學好觀察者模式有利用我們學習vue的源碼知識,當然不僅限于此,所以觀察者模式值得我們好好學習,一句話:"你品,你細品!" 今天付出的努力,在日后總會換成工資來回報你的!

以上就是怎樣用JavaScript實現(xiàn)觀察者模式的詳細內(nèi)容,更多關于JavaScript觀察者模式的資料請關注腳本之家其它相關文章!

相關文章

  • JavaScript隱式類型轉換代碼實例

    JavaScript隱式類型轉換代碼實例

    這篇文章主要介紹了JavaScript隱式類型轉換代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • 跨域傳值即主頁面與iframe之間互相傳值

    跨域傳值即主頁面與iframe之間互相傳值

    主頁面A 怎么向 iframe B 傳遞數(shù)據(jù)呢?iframe B 怎么向 主頁面A 傳遞數(shù)據(jù),下面有不錯的實現(xiàn)思路,感興趣的朋友可以了解下
    2013-12-12
  • 關于Stream和Buffer的相互轉換詳解

    關于Stream和Buffer的相互轉換詳解

    這篇文章主要給大家介紹了關于Stream和Buffer相互轉換的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。
    2017-07-07
  • 如jQuery般易用的api風格代碼分享

    如jQuery般易用的api風格代碼分享

    最近幾天閑來無事,隨便寫了點代碼玩了玩。個人覺得,應該把編碼當做一種樂趣,要不然會覺得很累...
    2011-01-01
  • windows系統(tǒng)下簡單nodejs安裝及環(huán)境配置

    windows系統(tǒng)下簡單nodejs安裝及環(huán)境配置

    相信對于很多關注javascript發(fā)展的同學來說,nodejs已經(jīng)不是一個陌生的詞眼,這里不想談太多的nodejs的相關信息。只說一下,windows系統(tǒng)下簡單nodejs環(huán)境配置
    2013-01-01
  • layui之select的option疊加問題的解決方法

    layui之select的option疊加問題的解決方法

    下面小編就為大家分享一篇layui之select的option疊加問題的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • JavaScript事件類型中UI事件詳解

    JavaScript事件類型中UI事件詳解

    這篇文章主要介紹了JavaScript事件類型中UI事件詳解的相關資料,需要的朋友可以參考下
    2016-01-01
  • javascript中DOM復選框選擇用法實例

    javascript中DOM復選框選擇用法實例

    這篇文章主要介紹了javascript中DOM復選框選擇用法,實例分析了javascript操作復選框?qū)崿F(xiàn)全選與反選的相關技巧,需要的朋友可以參考下
    2015-05-05
  • bootstrap監(jiān)聽滾動實現(xiàn)頭部跟隨滾動

    bootstrap監(jiān)聽滾動實現(xiàn)頭部跟隨滾動

    這篇文章主要為大家詳細介紹了bootstrap監(jiān)聽滾動實現(xiàn)頭部跟隨滾動,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 兼容IE,firefox的獲取節(jié)點的文本值的javascript代碼

    兼容IE,firefox的獲取節(jié)點的文本值的javascript代碼

    javascript獲取節(jié)點的文本值,已經(jīng)考慮了兼容性。大家可以放心使用。注意了這里的兼容沒有使用innerText,如果要使用兼容innerText,請參考腳本之家以前發(fā)布的文章。
    2009-12-12

最新評論

杨浦区| 金寨县| 屏东市| 大港区| 汤阴县| 阳原县| 蒲江县| 永顺县| 乐山市| 霍城县| 禄丰县| 安顺市| 双城市| 泗洪县| 鲜城| 金秀| 福泉市| 上蔡县| 蒙城县| 灵石县| 天全县| 宝清县| 年辖:市辖区| 剑川县| 常山县| 监利县| 麻栗坡县| 海阳市| 潞城市| 松潘县| 吐鲁番市| 抚远县| 沧州市| 白山市| 凌源市| 伊金霍洛旗| 年辖:市辖区| 遂溪县| 海林市| 镶黄旗| 类乌齐县|