为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用观察者模式?

如何使用观察者模式?

蛊毒传说 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个赞

在最简单的形式中,观察者不过是由主题调用的功能。更多“复杂”的观察者将是带有“通知”或类似功能,错误处理程序以及也许是“完成”通知的对象,具体取决于主题。


因此,这是一个非常基本的示例来说明这一点:


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 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信