設計模式-發布訂閱模式

這段時間在看vue的雙向綁定原理,知道了vue的核心三大件:Observer, Complie, Watcher。

Observer用于監聽屬性的變化,如有變動就通知 Watcher。

Compile負責解析元素節點的指令,如v-if,v-bind之類, 進行數據和回調函數的綁定。

Watcher收到屬性變動的通知,就觸發對應屬性的回調函數,更新視圖。

在學習 Watcher 的實現時,發現用的是發布訂閱模式,也稱觀察者模式。

其實我們從開始用 js/jQuery 監聽事件開始,就已經在用發布訂閱模式了。

例如 DOM 中的 addEventListener, jquery 的 on 綁定事件。

發布訂閱模式,比較好理解。舉幾個例子:

電飯煲煮飯,電飯煲本身并不知道要在什么時候跳到保溫,它就只能等通知,等到飯燒好了,電飯煲的某個控制器就發出一個通知, 喂喂喂,飯熟了,不要再煮了。OK,電飯煲的電源控制器收到通知了,好,我跳保溫。

dianfanbao.addEvent('煮好了', function(){jumpTo('保溫');
});
復制代碼

生活中的燒水啊,空調定時啊,你要買房子需要等開盤消息呀,都可以算是發布訂閱模式吧。

發布訂閱的核心思想就是維護一個對象,對象里面存放著各種事件的數組,根據不同的事件遍歷不同的數組,執行回調。

一言不合上代碼

class EventModel {constructor() {this.events = {};}on(eventType, fn) {if (!this.events[eventType]) {this.events[eventType] = [];}this.events[eventType].push(fn);}trigger(eventType, ...args) {let eventCallbacks = this.events[eventType];if (Array.isArray(eventCallbacks)) {eventCallbacks.forEach( fn => fn.apply(this, args) );}}off(eventType, fn) {let eventCallbacks = this.events[eventType];if ( !fn ) {eventCallbacks.length = 0;}let idx = eventCallbacks.indexOf(fn);if (idx !== -1) {eventCallbacks.splice(idx, 1);}}
}
復制代碼

測試

let event = new EventModel();let f = x => alert(x);
event.on('click', f);
event.trigger('click', 2);   //alert(2);
event.off('click', f);
復制代碼

這周末比較忙,就先簡單記錄一下,爭取早日搞懂雙向綁定原理,分享出來給有需要的人。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390326.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

杜教篩--51nod1239 歐拉函數之和

求$\sum_{i1}^{n}\varphi (i)$,$n\leqslant 1e10$。 這里先把杜教篩的一般套路貼一下: 要求$S(n)\sum_{i1}^{n}f(i)$,而現在有一數論函數$g(i)$,$g(i)$的前綴和很無腦,且$f$和$g$的狄利克雷卷積的前綴和很無腦&#xf…

【Android Studio安裝部署系列】目錄

概述 從剛開始使用Android Studio到現在,下面所有目錄下的操作,當時習慣性的把每一個整理成一個文檔(其實就是簡單文字描述截圖);有些地方當時是一知半解,現在會稍微明白一些。正好趕上現在有時間。所以就想…

修改npm全局安裝模式的路徑

修改npm全局安裝模式的路徑 在正式寫此文章之前,我得說一點血淚史。 剛學nodeJS不久,很納悶為什么全局安裝的模塊在 node安裝目錄/node_modules‘ 中沒找到!后來仔細看了下安裝成功后的信息,才發現原來是自動安裝在C盤了&#xff…

javascript創建類_如何使用JavaScript創建吹氣效果

javascript創建類Have you ever wondered how you can create a realistic air blowing effect with JavaScript? Like the one shown on the evening TV shows, where multiple balls are being mixed up in a sphere-like object by leveraging air pressure? If you want …

Bootstrap 4:如何使頂部固定的Navbar保持在容器中而不拉伸?

There are many ways to make a fixed navbar stay inside a parents div container. Well go over the most straightforward one here.有很多方法可以使固定的導航欄停留在父級的div容器中。 我們將在這里介紹最簡單的方法。 Imagine you have the following code, modified…

基于SpringBoot+Mybatis+Thymeleaf商品信息管理系統

github地址:github.com/zaiyunduan1…,如果對你有幫助,歡迎Star 主要用到的技術: 使用maven進行項目構建使用SpringbootMybatis搭建整個系統使用Thymeleaf模板技術實現頁面靜態化使用框架Bootstrap、JQuery開發前端界面使用MySQL和MongoDB分別…

在Mac上為自己手動編譯安裝一套PHP7的開發環境

首先你得去官網下載php7 beta1的版本 這里由于我是在mac上安裝,所以就去下載linux相關的版本,地址也直接附上了php7 beta1windows版的官方也有發布詳情猛戳:這里 解壓安裝包,進入源代碼目錄 tar -zxvf php-7.0.0beta1.tar.gz cd p…

卡特蘭數 HDU2067 HDU4165 HDU1134

題目鏈接:https://vjudge.net/problem/HDU-2067 小兔的棋盤 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11800 Accepted Submission(s): 5952 Problem Description小兔的叔叔從外面旅游回來給她…

Python的用途是什么? Python編程語言有10多種編碼用途。

👋歡迎 (👋 Welcome) Hi! Please take a moment to think about this question: 嗨! 請花一點時間考慮這個問題: How is Python applied in real-world scenarios? Python如何在實際場景中應用? If you are learnin…

Publish/Subscribe

Publish/Subscribe 我們將會投遞一個消息給多個消費者,這種模式被稱為“publish/subscribe” 通俗的講,前面的是點對點隊列模型,現在講的是發布訂閱模型。 Exchanges producer:一個發送消息的用戶應用程序 queue:一個存…

[轉]在ROS下使用zeroconf配置多機通信

原文地址:http://www.corvin.cn/635.html,轉載主要方便隨時查閱,如有版權要求,請及時聯系。 0x00 為何需要配置ROS多機通信 眾所周知ROS是分布式系統,因此可以將機器人需要處理的復雜、計算量大的任務分解在多臺機器上…

python中斐波那契數列_斐波那契數列–在Python,JavaScript,C ++,Java和Swift中進行了解釋...

python中斐波那契數列by Pau Pavn通過保羅帕文(PauPavn) The Fibonacci sequence is, by definition, the integer sequence in which every number after the first two is the sum of the two preceding numbers. To simplify:根據定義,斐波那契數列是整數序列&a…

1583. 統計不開心的朋友

1583. 統計不開心的朋友 給你一份 n 位朋友的親近程度列表,其中 n 總是 偶數 。 對每位朋友 i,preferences[i] 包含一份 按親近程度從高到低排列 的朋友列表。換句話說,排在列表前面的朋友與 i 的親近程度比排在列表后面的朋友更高。每個列…

uva 247(floyd傳遞閉包)

為什么&#xff0c;逗號后面&#xff0c;還有空格........ #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <vector> #include <map> using namespace std; const int maxn50; int d[maxn][max…

VS Code 的常用快捷鍵和插件

注:文章摘自 風行天下一萬號 - 博客園 vs code 的常用快捷鍵 1、注釋&#xff1a; 單行注釋&#xff1a;[ctrlk,ctrlc] 或 ctrl/取消單行注釋&#xff1a;[ctrlk,ctrlu] (按下ctrl不放&#xff0c;再按k u)多行注釋&#xff1a;[altshiftA]多行注釋&#xff1a;/**2、移動行&a…

python包numpy_NumPy Python科學計算軟件包的終極指南

python包numpyNumPy (pronounced "numb pie") is one of the most important packages to grasp when you’re starting to learn Python.NumPy(讀作“麻木派”)是您開始學習Python時要掌握的最重要的軟件包之一。 The package is known for a very useful data str…

NGINX原理 之 SLAB分配機制(轉)

1 引言 眾所周知&#xff0c;操作系統使用伙伴系統管理內存&#xff0c;不僅會造成大量的內存碎片&#xff0c;同時處理效率也較低下。SLAB是一種內存管理機制&#xff0c;其擁有較高的處理效率&#xff0c;同時也有效的避免內存碎片的產生&#xff0c;其核心思想是預分配。其按…

apk之間數據共享的方式

1、四大組件之ContentProvider大法2、shareUserId3、apk均去遠端獲取配置文件&#xff08;或接口&#xff09;4、AIDL&#xff08;bindService&#xff09;5、SharePreference設置為MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE模式&#xff0c;由于存在安全問題&#xff0c;已被…

藍橋杯java 基礎練習 十六進制轉十進制

問題描述從鍵盤輸入一個不超過8位的正的十六進制數字符串&#xff0c;將它轉換為正的十進制數后輸出。注&#xff1a;十六進制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。樣例輸入FFFF樣例輸出65535import java.math.BigInteger; import java.util.Scanner;public …

dynamic web module消失不見

2019獨角獸企業重金招聘Python工程師標準>>> 方法1&#xff1a;在project Facets選項中勾選Dynamic Web Module即可 方法2&#xff1a; 我用eclipse對項目進行修改名稱&#xff0c;修改成功后。項目就沒有Deployment Descriptor&#xff08;如下圖紅色框中&#xff…