发布订阅模式

发布订阅模式

很多的前端框架都适用了发布订阅的模式来实现局部的刷新,下面的一个例子简单说明了什么是发布订阅模式。

设想有这样一个猎人联盟,猎人们可以通过它来发布一些狩猎信息,也可以在这里订阅别人发布的信息。每当有猎人发布信息的时候,联盟就把信息转发给所有订阅了的猎人们,猎人们则依次开展行动。

/**
 * 猎人联盟
 * 猎人的订阅信息(行动)存在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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值