亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用觀察者模式?

如何使用觀察者模式?

蠱毒傳說 2021-05-01 14:14:27
我才剛剛開始了解觀察者模式的工作原理。但是現在我想使用它。我看到了很多觀察者模式的示例,但大多數只是簡單地演示了該模式,而沒有顯示其已完成以完成任務。我了解觀察者會被某個對象通知。但是,我怎樣才能讓觀察者做某事呢?下面的代碼是一個常見的Observer Pattern程序。我看到console.log("Observer " + number + " is notified!");通知觀察者時,它執行console.log()。我是否可以在這里返回其他內容:值,函數調用等?我看過帶有簡單數學運算的可視示例,這些可視示例在通知觀察者時會更新計算(即成本+稅費=總計)。但是我找不到一個示例來說明代碼是如何實現的。1.如何/在何處返回新成本,以及2.因此,觀察者(一個函數?)被告知成本已改變;該功能如何/在何處接收更新的費用?我是新手,模式本身有點令人困惑。我希望看到一個超級基本的示例程序。var Subject = function() {  let observers = [];  return {    subscribeObserver: function(observer) {      observers.push(observer);    },    unsubscribeObserver: function(observer) {      var index = observers.indexOf(observer);      if(index > -1) {        observers.splice(index, 1);      }    },    notifyObserver: function(observer) {      var index = observers.indexOf(observer);      if(index > -1) {        observers[index].notify(index);      }    },    notifyAllObservers: function() {      for(var i = 0; i < observers.length; i++){        observers[i].notify(i);      };    }  };};var Observer = function(number) {  return {    notify: function() {      console.log("Observer " + number + " is notified!");    }  }}var subject = new Subject();var observer1 = new Observer(1);var observer2 = new Observer(2);subject.subscribeObserver(observer1);subject.subscribeObserver(observer2);subject.notifyObserver(observer2);subject.unsubscribeObserver(observer2);subject.notifyAllObservers();
查看完整描述

3 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

在最簡單的形式中,觀察者不過是由主題調用的功能。更多“復雜”的觀察者將是帶有“通知”或類似功能,錯誤處理程序以及也許是“完成”通知的對象,具體取決于主題。


因此,這是一個非?;镜氖纠齺碚f明這一點:


var Subject = function() {

  let observers = [];


  return {

    subscribe: function(observer) {

      observers.push(observer);

    },

    unsubscribe: function(observer) {

      var index = observers.indexOf(observer);

      if(index > -1) {

        observers.splice(index, 1);

      }

    },

    nextValue: function(value) {

      // call every registered observer

      for(var i = 0; i < observers.length; i++){

        observers[i](value);

      }

    }

  };

};


// now simply pass an observer function to the subject

const subject = new Subject();


subject.subscribe(value => {

  // do whatever you want with the value, call functions etc.

  console.log(value);

});


subject.nextValue('hello world!');


查看完整回答
反對 回復 2021-05-13
?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

下面的代碼是一個常見的Observer Pattern程序。我看到它在通知觀察者時執行console.log(console.log(“ Observer” + number +“已通知!”);)。我是否可以在這里返回其他內容:值,函數調用等?


是,當主題調用通知時,它可以傳遞數據(而不是索引)或將自身傳遞給觀察者。通過這種方式,觀察者可以檢查主體的狀態并對其進行處理。方法notifyObserver變為:


notifyObserver: function(observer) { 

    var index = observers.indexOf(observer); 

    if(index > -1) { 

        observers[index].notify(this); 

    }

},

觀察者就像:


var Observer = function(number) { 

    return { 

        notify: function(subject) { 

            // do something with subject 

           ... 

        } 

     } 

}


查看完整回答
反對 回復 2021-05-13
  • 3 回答
  • 0 關注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號