js 設計模式——觀察者模式

来源:https://www.cnblogs.com/loveyt/archive/2019/04/27/10778986.html
-Advertisement-
Play Games

觀察者模式 定義 觀察者模式(又被稱為發佈 訂閱(Publish/Subscribe)模式,屬於行為型模式的一種,它定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態變化時,會通知所有的觀察者對象,使他們能夠自動更新自己 註意(觀察者模式和發佈訂閱是有不同的) 區 ...


觀察者模式

定義

觀察者模式(又被稱為發佈-訂閱(Publish/Subscribe)模式,屬於行為型模式的一種,它定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態變化時,會通知所有的觀察者對象,使他們能夠自動更新自己

註意(觀察者模式和發佈訂閱是有不同的)

區別

觀察者模式 在軟體設計中是一個對象,維護一個依賴列表,當任何狀態發生改變自動通知它們。

發佈-訂閱模式 消息的發送方,叫做發佈者(publishers),消息不會直接發送給特定的接收者,叫做訂閱者。

左邊相當於微信里的微商-顧客之間的關係。右邊相當於商家-淘寶-顧客之間的關係

觀察者模式:顧客關註了微商的商品,微商會記住顧客關註的商品,一旦上新就直接 私聊 通知所有關註這個商品的顧客。這裡的顧客就相當於觀察者,這裡的微商就相當於主題

訂閱發佈模式:顧客通過淘寶(APP或者網站)關註了商家的商品,商家一旦上新就通過淘寶(APP或者網站)向關註了它的顧客 群發 消息。這裡的顧客就是訂閱者,這裡的淘寶就是事件匯流排,這裡的商家就是發佈者

DOM事件

只要我們曾經在DOM節點上面綁定過事件函數,那我們就使用過觀察者模式,應為JS和DOM之間就是實現了一種觀察者模式

document.body.addEventListener("click", function() {
    alert("Hello World")
},false )
document.body.click() //模擬用戶點擊

自定義一個簡單的小例子

// 定義商家
let merchants = {}
// 定義預定列表
merchants.orderList = {}
// 將增加的預訂者添加到預定客戶列表中
merchants.listen = function(id, info) {
  if(!this.orderList[id]) {
    this.orderList[id] = []
  }
  this.orderList[id].push(info)
  console.log('預定成功')
}
//發佈消息
merchants.publish = function(id) {
  let infos = this.orderList[id]
  // 判斷是否有預訂信息
  if(!infos || infos.length === 0) {
    console.log('您還沒有預訂信息!')
    return
  }
  // 如果有預訂信息,則迴圈列印
  infos.forEach((el, index) => {
    console.log('尊敬的客戶:')
    el.call(this, arguments)
    console.log('已經到貨了')
  })
}
merchants.remove = function(id, fn) {
  // 撤銷訂單 
  var infos = this.orderList[id]
  if(infos instanceof Array){
    infos.forEach((el, index) => {
      el === fn &&  this.orderList[id].splice(index, 1)
    })
  }
  console.log('撤銷成功')
}
// 定義一個預訂者customerA,並指定預定信息
let customerA = function() {
    console.log('黑色至尊版一臺')
}
let customerB = function() {
    console.log('白色至尊版一臺')
}
let customerC = function() {
    console.log('紅色至尊版一臺')
}
// customerA 預定手機,並留下預約電話
merchants.listen('15888888888', customerA) // 預定成功
merchants.listen('15888888888', customerB) // 預定成功
merchants.listen('15777777777', customerB) // 預定成功
merchants.listen('15777777777', customerC) // 預定成功
merchants.remove('15888888888', customerB) // 撤銷成功
// 商家發佈通知信息
merchants.publish('15888888888')
merchants.publish('15777777777')

預定成功
預定成功
預定成功
預定成功
撤銷成功
尊敬的客戶:
黑色至尊版一臺
已經到貨了
尊敬的客戶:
白色至尊版一臺
已經到貨了
尊敬的客戶:
紅色至尊版一臺
已經到貨了

優缺點

優點:

  • 時間上的解耦
  • 對象之間的解耦

缺點:

  • 創建訂閱者本身要消耗一定的時間和記憶體
  • 當訂閱一個消息時,也許此消息並沒有發生,但這個訂閱者會始終存在記憶體中。
  • 觀察者模式弱化了對象之間的聯繫,這本是好事情,但如果過度使用,對象與對象之間的聯繫也會被隱藏的很深,會導致項目的難以跟蹤維護和理解

對於觀察者模式還只是淺薄的認識,如有不對,還請大佬們指出,感謝(✿◕‿◕✿)

參考鏈接

JavaScript設計模式之觀察者模式

觀察者模式VS訂閱發佈模式


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前提摘要 尤大大的vue3.0即將到來,雖然學不動了,但是還要學的啊,據說vue3.0是基於proxy來進行對值進行攔截並操作,所以es6的proxy也是要學習一下的。 一 什麼是proxy Proxy 對象用於定義基本操作的自定義行為(如屬性查找,賦值,枚舉,函數調用等) 摘自MDN Proxy ...
  • 關閉jquery-easui tab標簽頁前觸發事件 by:授客 QQ:1033553122 測試環境 jquery-easyui-1.5.3 需求場景 點擊父頁面tab 頁關閉按鈕時,需要做判斷,判斷該tab頁面是否可以關閉:獲取子頁面js中定義的taskStatus,如果taskStatu不為t ...
  • 所謂js的中的傳值,其實也就是說5種基本數據類型(null,undefind,boolean,number,string) 傳引用也就是說的那個引用數據類型,(array和object) 基本數據類型的值不可變,而引用數據類型的值是可變的 所以當你比較數組和對象時,都是false;除非你是克隆的原份 ...
  • JS的基本語法要求 1. 嚴格區分大小寫 2. 標識符命名要求(與java完全相同) 首個字元只能是 字母、下劃線、美元符號 其他位置只能是 字母、下劃線、美元符號、數字 3. 變數的聲明 JavaScript的聲明必須要使用var關鍵字,聲明方式有兩種。 聲明並且賦值:var 變數名 = 值 先聲 ...
  • canvas實現隨機驗證碼 知識點 canvas生成背景圖和文字 設置字體樣式和大小 String的fromCharCode(code碼)生成大小寫字母和數字 str.toLowerCase()轉小寫 隨機抽取不重覆的6位數字組成驗證碼字元串 效果圖 html: css: js: javascrip ...
  • quillJS 富文本編輯器目前是一款很火富文本編輯器,使用廣泛,github 上面的 star 有 22,492,雖然說不以 star 論英雄,不過這可以說明它還是比較受歡迎的; 它的特點是:輕量,易上手,易擴展,開源,所見即所得的一款現代編輯器,還有一點是它的實現思路和其他的編輯器有點不一樣(會 ...
  • 作為一個前端新人,學習了設計模式以後,希望能從源頭上,用淺顯易懂的語言來解釋它。當然不一定是正確的,只是我個人對設計模式的一點淺顯理解。 創建型設計模式 創建型設計模式:故名思意,這些模式都是用來創建實例對象的。 單例模式:首先我們需要理解什麼是單例。單:指的是一個。例:指的是創建的實例。單例:指的 ...
  • js 函數式編程 定義把函數作為第一類對象是函數式編程的第一步,函數式編程是一種編碼風格,他通過書寫函數式代碼來解決問題(而不是一系列執行步驟,就像 就像那種更主流的命令式編程),函數式編程可以讓代碼更容易測試、擴展、及模塊化 1.函數是javascript中的一等公民,(主要是的某個變數可以等於一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...