如何使用Observer模式?

问题描述 投票:3回答:3

我刚刚开始理解观察者模式的工作原理。但现在我想把它用掉。我看到了许多观察者模式的例子,但大多数只是演示模式,并没有显示它被实现以完成任务。

我理解观察者会被一个主题通知。但是,我怎样才能让观察者做一些事情呢?

下面的代码是一个常见的观察者模式程序。我看到它在通知观察者时执行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();
javascript observer-pattern
3个回答
1
投票

在最简单的形式中,Observer只是一个由Subject调用的函数。更“复杂”的观察者将是具有“通知”或类似功能的对象,错误处理程序以及可能的“完成”通知,具体取决于主题。

所以这是一个非常基本的例子来证明这一点:

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!');

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
投票

下面的代码是一个常见的观察者模式程序。我看到它执行了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 
           ... 
        } 
     } 
}
© www.soinside.com 2019 - 2024. All rights reserved.