观察者模式当对象之间存在一对多的依赖关系时,当被观察对象的状态发生变化时,所有观察它的对象都会收到通知,这这就是观察者模式。基本思想在观察者模式中,只有两个主体:目标对象(Subject)和观察者(Observer)。在Observer模式中,Subject对象有添加、删除、通知一系列Observers等方法,Observer对象有update方法等。在Subject对象中加入一系列Observer对象后,Subject对象维护Observer对象系列。当状态发生变化时,Subject对象会通知一系列的Observer对象进行更新。优点是耦合度高,通常用来实现一些响应式的效果;作用很明确,没有作为中介的事件调度中心,目标对象Subject和观察者Observer必须实现约定的成员方法;双方联系紧密,目标对象的主动性很强,自己收集和维护观察者,状态变化时主动通知观察者更新;realize//目标对象类Subject{constructor(){this.observers=[]}add(observer){this.observers.push(observer)}notify(){this.observers.map(observer=>{if(observer&&typeofobserver.update==='function'){observer.update()}})}remove(observer){常量idx=this.observers.findIndex(itm=>itm===observer)if(idx!==-1){this.observers.splice(idx,1)}}}//观察者类Observer{constructor(name){this.name=name}update(){console.log(`${this.name}updated`)}}constsubject=newSubject()consto1=newObserver('Nina')consto2=newObserver('Jack')subject.add(o1)subject.add(o2)console.log('第一次通知:')subject.notify()subject.remove(o1)console.log('删除Nina后,再次通知:')subject.notify()输出为:发布-订阅模式是基于一个事件(主题)通道,想要接收通知的对象Subscriber通过自定义事件订阅主题,并且是激活事件的对象Publisher通过发布主题事件通知每个订阅该主题的Subscriber对象,即发布-订阅模型。发布-订阅模型中包含三种角色:Publisher发布者、EventChannel和Subscriber。特点在发布-订阅模型中,对发布者Publisher和订阅者Subscriber没有特殊的约束。他们使用事件调度中心提供的接口发布和订阅事件,并且不知道对方是谁;松散耦合,高度灵活,常被用作事件总线;易于理解,可以类比DOM事件中的dispatchEvent和addEventListener;缺点:当事件类型越来越多时,难以维护。需要考虑事件命名规范,防止数据流混乱。实现类EventEmitter{constructor(){this.list={}if(!EventEmitter.instance){EventEmitter.instance=this}returnEventEmitter.instance}on(name,fn){if(!this.list[name]){this.list[name]=[]}this.list[name].push(fn)}emit(...rest){constname=([].shift.call(rest))constfns=this.列表[名称]||[]fns.forEach((fn)=>{fn.apply(this,rest)})}off(name){this.list[name]=[]}clean(){this.list={}}}conste1=newEventEmitter()e1.on('go',(name)=>console.log(`${name}went`))e1.on('come',(name)=>console.log(`${name}iscoming`))e1.emit('go','Nina')e1.emit('go','Jack')e1.emit('come','Bill')从概念上理解这两个概念和实现的区别。两者没有区别。它们都在解决方案对象之间解耦。它们在某个时间点通过一个事件被触发,监听这个事件的订阅者可以执行相应的动作。手术。实现方式不同。观察者模式通过发布者自己维护订阅事件的订阅者,后续的一系列操作都要通过发布者来完成。在发布-订阅模式下,订阅者和发布者之间会有一个事件总线,操作必须通过事件总线完成。CoupledObserver模式是耦合对象和观察者的面向对象和面向观察者的编程。观察者和被观察者之间仍然存在耦合,被观察者仍然认识观察者;发布-订阅模型是为调度中心编程的,用于解耦发布者和订阅者。发布者和订阅者之间不需要知道对方的存在,通过消息代理进行通信,解耦更彻底;关系观察者模式下的观察者和被观察者就像是商家和顾客的关系。商品更新等时,商家会直接通知订阅客户。发布-订阅模型的发布者和订阅者就像商家-APP-客户之间的关系。客户(订阅者)在APP上订阅产品通知。当产品更新时,商家(发布者)通过APP(订阅者)通知订阅客户。从使用的角度来看,观察者模式多用于单个应用内部;发布-订阅模式更多的是跨应用模式,比如消息中间件;
