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

javascript设计模式-观察者模式

时间:2023-03-28 15:39:33 HTML

事件发生时使用可观察对象通知订阅者解释观察者模式,一些对象(观察者)可以订阅另一个对象,称为可观察对象每当事件发生时,可观察对象会通知所有Observer!即一旦可观察对象发生变化,所有的观察者都会被观察者通知:可以类比很多人在看某个东西。当这个东西发生变化时,观察者可以感受到相应的变化observableobject:一个可以通知观察者的可变对象概念。有了上面的描述,我们就可以实现这样一个模式了。首先,在这个模式中,我们需要添加几个概念observers:用来存储一系列的观察者。把观察者放入observersunsubscribe的方法:removeobserversfromobserversnotify:当事件发生时,通知观察者实现上面的概念,我们来实现classObservable{constructor(){this.observers=[];}subscribe(func){this.observers.push(func);}unsubscribe(func){this.observers=this.observers.filter(observer=>observer!==func);}通知(数据){这个。观察者。forEach(观察者=>观察者(数据));}}应用现在我们实现了观察者模式,是不是很简单,那么可以用在什么地方呢?假设这样一个例子,当我们点击页面上的某个按钮时,我们需要进行很多操作,比如记录日志、弹窗、提交信息、切换按钮等,很多时候我们会将这些方法写在一个句柄函数中对于处理,当然这样做是没有问题的,但是如果你使用观察者模式,你的代码逻辑会变得更加精简和清晰。当然,上面的逻辑比较简单,但是在业务逻辑中,这些内容就会变得很复杂。流程主要如下,每当用户执行handleClick操作时,就会触发notify方法,notify会通知所有的观察者。这里的观察者就是所有要执行的方法。实际代码如下。我们首先创建观察者。上面我们提到了一系列的观察者,我们使用伪代码来实现功能logger(data){console.log(Data.now+data)}functionalerter(data){alert(Data.now+data)}functionsubmitData(data){submit(data)}functionchangeSwitch(data){change(data?true:false)}虽然我们有这些观察者,但我们需要将它们添加到观察者中。按照前面的实现,我们需要调用订阅方法constobservable=newObservable()observable.subscribe(logger)observable.subscribe(alerter)observable.subscribe(submitData)observable.subscribe(changeSwitch)//当然,你可以优化subscribe传入一个数组,这样就不用调用那么多次了现在观察者准备好了,接下来我们要实现通知方法,因为handleClick被点击了,就可以做相应的通知并传过去数据,所以我们可以做这个函数handleClick1(){observable.notify('message')}现在我们已经完成了发布和订阅的整个过程。当然这只是一个例子,点击事件对我们来说其实是异步的。鉴于此,很容易认为观察者模式在处理异步逻辑时非常有用。比如等界面回来后,我们处理一些任务,或者得到一些通知,或者你希望某些组件在某些数据下载完成时得到通知,或者用户给留言板发消息时通知其他人.你可以用这个当然,这种模式最大的好处就是在团队开发中,尤其是在大型项目中,一个开发人员很难熟悉项目中的各个模块。这种观察者模式的优势就出来了。模块之间的信息传递不需要引入其他模块。它只需要通过观察者模式注册或发布消息。这种模式可以在开发自己的模块时隔离其他模块,防止其他业务逻辑。有关影响参考https://www.patterns.dev/post...