如何使用观察者模式?

时间:2019-04-26 04:58:08

标签: javascript observer-pattern

我才刚刚开始了解观察者模式的工作原理。但是现在我想使用它。我看到了很多观察者模式的示例,但大多数只是简单地演示了该模式,而没有显示其已完成以完成任务。

我了解到观察者会被主题通知。但是,我怎样才能使观察者做某事呢?

下面的代码是常见的观察者模式程序。我看到通知观察者时,它执行console.log(console.log("Observer " + number + " is notified!");)。我是否可以在这里返回其他内容:值,函数调用等?

我看过一些带有简单数学运算的可视示例,这些可视示例会在通知观察者时更新计算(即费用+税费=总计)。但是我找不到一个示例来说明代码是如何实现的。 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 个答案:

答案 0 :(得分:1)

只需使用RxJs库。

https://www.learnrxjs.io/

const { Subject } = rxjs;

const subject$ = new Subject();

subject$.subscribe(val => { console.log(val); });

subject$.next('Hello');
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.min.js"></script>

答案 1 :(得分:1)

  

下面的代码是常见的观察者模式程序。我看到它在通知观察者时执行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 
           ... 
        } 
     } 
}

答案 2 :(得分:1)

以最简单的形式,观察者不过是由主题调用的函数。更具“复杂性”的观察者将是具有“通知”或类似功能,错误处理程序甚至可能是“完成”通知的对象,具体取决于主题。

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

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!');
相关问题