前端設(shè)計模式-觀察者模式(上)

觀察者模式

  1. 發(fā)布&訂閱

  2. 一對多

  3. 優(yōu)點:更加解耦,支持廣播通信

  4. 缺點:大量觀察者,廣播有性能問題

    // 主題對象
    class Subject {
      constructor() {
        this.state = {};
        this.observers = [];
      }
    
      getState() {
        return this.state;
      }
    
      setState(state) {
        this.state = state;
        this.notifyAllObservers();
      }
    
      notifyAllObservers() {
        this.observers.forEach(observer => {
          observer.update();
        });
      }
    
      attach(observer) {
        this.observers.push(observer);
      }
    
    }
    
    // 觀察者
    class Observer {
      constructor(name, subject) {
        this.name = name;
        this.subject = subject;
        this.subject.attach(this);
      }
    
      update() {
        console.log(`${this.name} update, state: ${this.subject.getState()}`);
      }
    }
    
    // 測試
    
    let sub = new Subject();
    
    let ob1 = new Observer('Confidence', sub);
    let ob2 = new Observer('Java', sub);
    let ob3 = new Observer('NodeJs', sub);
    
    sub.setState(1);
    
  5. 場景

    • 網(wǎng)頁事件綁定
      $('#btn').click(function() {
        console.log(1);
      });
      $('#btn').click(function() {
        console.log(2);
      });
      
    • Promise
      function loadImg() {
        const promise = new Promise((resolve, reject) => {
          var img = document.createElement('img');
          img.onload = function() {
            resolve(img);
          }
          img.onerror = function() {
            reject('圖片加載失敗);
          }
          img.src = 'https://....xxx.png';
        });
        return promise;
      }
      
      
      loadImg().then(res => {
        return res;
      }).then(res => {
        console.log(res);
      })
      
    • jQuery callbacks
      var callbacks = $.Callbacks();
      callbacks.add(function(info) {
        console.log('fn1', info);
      });
      callbacks.add(function(info) {
        console.log('fn2', info);
      });
      
      callbacks.fire('arg1');
      callbacks.fire('arg2');
      
    • nodejs自定義事件
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 3,219評論 0 3
  • 單例模式 適用場景:可能會在場景中使用到對象,但只有一個實例,加載時并不主動創(chuàng)建,需要時才創(chuàng)建 最常見的單例模式,...
    Obeing閱讀 2,321評論 1 10
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,153評論 0 2
  • 一、觀察者模式概述 +觀察者模式又叫做發(fā)布-訂閱模式觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同事監(jiān)聽...
    Mitchell閱讀 283評論 0 0
  • 1. 概述 有時被稱作發(fā)布/訂閱模式,觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象...
    eb51589b1211閱讀 438評論 0 0

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