观察者模式与发布订阅模式对比

直接上代码,很简单的两个例子:

// subscribe_publish: 发布订阅模式
// 有一个中间的事件通信通道,订阅者A和发布者B是通过pubsub这个对象关联起来的,他们没有直接的交流。
console.log("pubsub:")
var pubsub = (()=>{
    var topics = {};
    function subscrbe(topic, fn){
        if(!topics[topic]){
            topics[topic] = [];
        }
        topics[topic].push(fn);
    }
    function publish(topic, ...args){
        if(!topics[topic])return;
        for(let fn of topics[topic]){
            fn(...args);
        }
    }
    return {
        subscrbe,
        publish
    }
})();
pubsub.subscrbe('test', function(a,b){
    console.log(a,b);
})
pubsub.publish('test', 'hello','world!');

console.log("-----------------------------");

// observer: 观察者模式
// 一个或多个观察者对目标的状态感兴趣,通过将自己依附在目标对象上以便注册所感兴趣的内容。
// 目标状态发生改变并且观察者可能对这些改变感兴趣,会发送一个通知消息,调用每个观察者的更新方法。
// 当观察者不再对目标状态感兴趣时,他们可以简单将自己从中分离。
console.log("observer:");
class Subject {
    constructor(){
        this.subs = [];
    }
    addSubs(sub){
        this.subs.push(sub);
    }
    nodify(){
        this.subs.forEach(sub => {
            sub.update();
        })
    }
}
class Observer{
    update(){
        console.log('update')
    }
}
let subject = new Subject();
let ob = new Observer();
subject.addSubs(ob);
subject.nodify();

// 目标和观察者是直接联系在一起的。观察者把自身添加到了目标对象中,可见和发布订阅模式差别还是很大的。
// 在这种模式下,目标更像一个发布者,他让添加进来的所有观察者都执行了update函数,而观察者就像一个订阅者。

参考文章:https://www.jianshu.com/p/f0f22398d25d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值