发布订阅模式
很多的前端框架都适用了发布订阅的模式来实现局部的刷新,下面的一个例子简单说明了什么是发布订阅模式。
设想有这样一个猎人联盟,猎人们可以通过它来发布一些狩猎信息,也可以在这里订阅别人发布的信息。每当有猎人发布信息的时候,联盟就把信息转发给所有订阅了的猎人们,猎人们则依次开展行动。
/**
* 猎人联盟
* 猎人的订阅信息(行动)存在topics里面
* 发布的时候会执行对应topic里面的全部行动
*/
class HunterUnion {
constructor() {
this.topics = {};
}
subscribe(topic, action) {
if(!this.topics[topic]) {
this.topics[topic] = [];
}
this.topics[topic].push(action);
}
publish(topic, price) {
if(!this.topics[topic]) {
return;
}
// 订阅者的行动在这里展开
this.topics[topic].forEach(action => action(price))
}
}
const hunterUnion = new HunterUnion();
/**
* 猎人
* 订阅的时候把行动存在联盟的topics里
* 发布的时候触发联盟的发布方法-->触发对应的全部行动
*/
class Hunter {
constructor(name) {
this.name = name;
}
subscribe(topic, action) {
hunterUnion.subscribe(topic, action);
}
publish(topic, price) {
hunterUnion.publish(topic, price);
}
}
const hunterZhang = new Hunter('zhang');
const hunterLi = new Hunter('li');
hunterZhang.subscribe('fox', (price) => {
if(price > 200) {
console.log('hunterZhang will hunt the fox');
} else {
console.log('price is too low for hunterZhang');
}
})
hunterLi.subscribe('fox', (price) => {
console.log('hunterLi will hunt the fox no matter what price');
})
const hunterWang = new Hunter('wang');
hunterWang.publish('fox', 100);
// price is too low for hunterZhang
// hunterLi will hunt the fox no matter what price
hunterUnion.publish('fox', 300);
// hunterZhang will hunt the fox
// hunterLi will hunt the fox no matter what price