首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用观察者模式?

如何使用观察者模式?
EN

Stack Overflow用户
提问于 2019-04-26 04:58:07
回答 3查看 156关注 0票数 4

我刚刚开始理解观察者模式是如何工作的。但现在我想用它。我看到了许多关于观察者模式的例子,但大多数例子只是简单地演示了该模式,并且没有显示它是为完成任务而实现的。

据我所知,观察者会收到被调查对象的通知。但是,我怎样才能让观察者做一些事情呢?

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

我看过简单数学的可视化示例,在通知观察者时更新计算(即成本+税收=总计)。但我找不到一个例子来说明代码是如何使这种情况发生的。1.如何/在哪里返回新的成本;2.因此,观察员(函数)?获取成本已更改的通知;函数如何/在何处接收更新的成本?

我是个新手,这个模式本身就有点让人困惑。我想看一个超级基本的例子程序。

代码语言:javascript
复制
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();

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-26 09:56:49

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

这里有一个非常基本的例子来演示这一点:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-04-26 05:22:25

只需使用RxJs库即可。

https://www.learnrxjs.io/

代码语言:javascript
复制
const { Subject } = rxjs;

const subject$ = new Subject();

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

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

票数 1
EN

Stack Overflow用户

发布于 2019-04-26 07:19:58

下面的代码是一个常见的观察者模式程序。我看到它在通知观察者时执行console.log (“console.log(”console.log“+ number +”是被通知的!))。这是我可以返回其他东西的地方吗:值、函数调用等等?

是的,当主题调用通知时,它可以传递数据而不是索引,或者将自己传递给观察者。这样,观察者就可以观察主体的状态,并用它做一些事情。方法notifyObserver变成:

代码语言:javascript
复制
notifyObserver: function(observer) { 
    var index = observers.indexOf(observer); 
    if(index > -1) { 
        observers[index].notify(this); 
    }
},

观察者是这样的:

代码语言:javascript
复制
var Observer = function(number) { 
    return { 
        notify: function(subject) { 
            // do something with subject 
           ... 
        } 
     } 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55861027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档