我刚刚开始理解观察者模式的工作原理。但现在我想把它用掉。我看到了许多观察者模式的例子,但大多数只是演示模式,并没有显示它被实现以完成任务。
我理解观察者会被一个主题通知。但是,我怎样才能让观察者做一些事情呢?
下面的代码是一个常见的观察者模式程序。我看到它在通知观察者时执行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();
在最简单的形式中,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!');
只需使用RxJs库。
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>
下面的代码是一个常见的观察者模式程序。我看到它执行了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
...
}
}
}