当前位置: 首页 > Web前端 > HTML

发布订阅和观察者模式的区别

时间:2023-04-02 23:22:18 HTML

有人认为观察者模式就是发布订阅模式。实际上,观察者模式包括订阅-发布模式,发布-订阅模式只是观察者模式中的一种。观察者模式是观察者与被观察者之间的通信,在发布订阅模式中间增加了一个中转层,通过第三方分发信息。观察者模式//Subject是被观察者,如果Subject中的状态发生变化,则通知Observer更新类Subject{constructor(){this.observes=[]this.state=false}//this.observesstoresobserversattach(observe){this.observes.push(observe)}//状态改变,通知Observer触发更新setState(newState){this.state=newStatethis.observes.forEach(observer=>observer.update(newState))}}//Observer是观察Subject状态是否发生变化的观察者classObserver{constructor(name){this.name=name}//updateupdate(state){console.log(this.name+”,收到通知,被观察对象的属性变为“+state)}}varsub=newSubject()varobs1=newObserver('Observer1')varobs2=newObserver('Observer2')sub。attach(obs1)sub.attach(obs2)//观察者状态改变,触发观察者更新sub.setState(true)vue中数据劫持使用观察者模式,会通知视图界面为数据中的属性一发生变化就更新,从而实现数据驱动,如果想了解更多vue的底层原理,可以参考github上的一篇文章?MVVM实现发布-订阅模式//publish-订阅类事件{constructor(){this.sub={}//container}//不同的名字,订阅对应的函数$on(name,fn){constwrap=this.sub[name]||(this.sub[name]=[])wrap.push(fn)}//遍历所有同名订阅函数,并发布$emit(name,...args){constfns=this.sub[name]||[]fns.forEach(fn=>{fn.apply(this,args)})}//销毁以避免内存泄漏$of(name){this.sub[name]=null}}//事件等同于arelayconstevent=newEvents()//订阅事件。$on('eventname',function(a,b){console.log(a,b)})event.$on('eventname',function(a,b){console.log(a,b)})//发布事件.$emit('eventname','a','b')vue中兄弟组件通信总线的原理是发布-订阅模式,这有一个缺点。当你订阅了一条消息后,也许最后这条消息并没有发生,但是这个订阅者会一直存在于内存中,所以当这条消息不用的时候,调用$of销毁它,避免内存泄露。总结总而言之,在观察者模式下,观察者(Observer)知道Subject,Subject不断记录观察者。然而,在发布-订阅模式中,发布者和订阅者并不知道对方的存在。它们仅通过消息代理进行通信。观察者模式主要是同步的。例如,当一个事件被触发时,Subject会调用观察者的方法。发布和订阅往往通过共享全局状态来执行更多的异步事件~~~~。