0%

发布/订阅模式

发布/订阅模式(观察者模式)

观察者模式中存在两种类型的实体,一种是观察者(observer或者subscriber),一种是订阅者发布者或者主体(publisher或subject)。当某事件触发时发布者通知(调用)所有的订阅者并且可以向订阅者传递消息。

报纸订阅例子

paper对象作为publisher对象,拥有subscribers数组属性,subscribe方法,unsubscribe方法以及publish方法。

我们在subscribers中维护我们的订阅者,subscribe方法中添加订阅者到数组中,而unsubscribe方法从数组中移除订阅者,而publish方法则遍历数组并调用它们注册时提供的方法。

所有这些方法还需要有个type参数,因为paper对象可以发射多种类型事件,而我们的订阅者可以只订阅其中一种事件。对于任何的发布者对象这些成员都是一致的,所以我们可以使用mixin模式将他们copy到任何对象中使之成为一个publisher。

简单说明mixin模式,就是将多个对象上的属性混合到一个对象上,如这里简单的实现,只适用于浅拷贝场景:

1
2
3
4
5
6
7
8
9
10
11
function mix() {
var arg, prop, child = {};
for (arg = 0; arg < arguments.length; arg += 1) {
for (prop in arguments[arg]) {
if (arguments[arg].hasOwnProperty(prop)) {
child[prop] = arguments[arg][prop];
}
}
}
return child;
}