js简单实现发布订阅者模式

发布订阅模式

在发布订阅模式中,发布者和订阅者并不会直接交流,由一个中间调度者做中间人,实现消息的传递。相对于观察者模式,发布订阅模式的规模更适用于较大规模的消息通知
优点:发布订阅模式将对象之间解耦,发布者不必关心消息传递给谁,订阅者只需要负责对应主题消息的接受即可
缺点:订阅者一旦实例化就必须占用内存,但订阅者并不能一定获取到对应主题发送的消息,也就是这个主题不一定会有新的消息通知

JS代码实现

发布者=》主题中间件=》订阅者

// 发布者
    class Publish{
        constructor(){
            this.topicList = {}
        }
        // 发布者添加不同的主题
        addTopic(topic,topicItem){
            this.topicList[topic] = topicItem
        }
        publish(topic,value){
            this.topicList[topic] && this.topicList[topic].notify(value)
        }
    }
    // 主题
    class Topic{
        constructor(topic){
            this.topic = topic
            this.subList = []
        }
        addSub(subItem){
            this.subList.push(subItem)
        }
        // 主题负责通知所有的订阅者
        notify(value){
            this.subList.forEach(sub=>sub.update(value))
        }
    }
    // 订阅者   
    class Subscriber{
        constructor(value){
            this.value = value
        }
        update(value){
            this.value = this.value + value
            console.log(this.value)
        }
    }
    // 实例化一个发布者
    let newPub = new Publish()
    // 实例化一个topic主题
    let newTopic = new Topic('topic')
    // 将主题添加到发布者
    newPub.addTopic('topic',newTopic)
    // 实例化不同的订阅者
    let sub1 = new Subscriber(1)
    let sub2 = new Subscriber(2)
    // 主题添加不同的订阅者
    newTopic.addSub(sub1)
    newTopic.addSub(sub2)
    // 发布者发布消息
    newPub.publish('topic',3)
    //  打印结果
    // 4
    // 5
上一篇:在windows上搭建redis集群(redis-cluster)


下一篇:oracle数据库字符集和客户端字符集(2%)是不同的,字符集转化可能会造成不可预期的后果