摘要:发布订阅模式事件发布订阅模式在异步编程中帮助我们完成更松的解耦甚至在的架构中以及设计模式中也少不了发布订阅模式的参与。
发布订阅模式
事件发布/订阅模式 (PubSub) 在异步编程中帮助我们完成更松的解耦, 甚至在 MVC、MVVC 的架构中以及设计模式中也少不了发布-订阅模式的参与。
优点: 在异步编程中实现更深的解耦
缺点: 如果过多的使用发布订阅模式, 会增加维护的难度
实现一个发布订阅模式var Event = function() { this.obj = {} } Event.prototype.on = function(eventType,fn){ if(!this.obj[eventType]) { this.obj[eventType]=[] } this.obj[eventType].push(fn) //这边方法函数放进去 } Event.prototype.emit =function() { var eventType = Array.prototype.shift.call(arguments) var arr = this.obj[eventType] //这边方法函数取出来 for(let i =0;i订阅函数逻辑一定要优先于发布函数吗 考虑以下场景:
$.ajax("", () => { // 异步订阅函数逻辑 }) // 在其他地方执行发布函数, 此时并不能保证执行发布函数的时候, 订阅函数已经执行那么就应该这样做
var Event = function () { this.obj = {} this.cacheList = [] } Event.prototype.on = function (eventType, fn) { if (!this.obj[eventType]) { this.obj[eventType] = [] } this.obj[eventType].push(fn) for (let i = 0; i < this.cacheList.length; i++) { this.cacheList[i]() //on中触发cacheList里面储存的函数 } } Event.prototype.emit = function () { var arg = arguments var that = this function cache() { var eventType = Array.prototype.shift.call(arg) var arr = that.obj[eventType] for (let i = 0; i < arr.length; i++) { arr[i].apply(arr[i], arg) } } this.cacheList.push(cache) //emit触发的函数保存到cacheList中 //转交给on中去触发, 从而实现发布函数先于订阅函数执行 } var ev = new Event() ev.emit("click", 5) //这个使用的前提是 一定是先触发订阅 //然后等待 发布函数中的cacheList[i]()方法执行 ev.on("click", function (a) { console.log(a) })
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/106612.html
摘要:发布者的状态发生变化时就会通知所有的订阅者,使得它们能够自动更新自己。观察者模式的中心思想就是促进松散耦合,一为时间上的解耦,二为对象之间的解耦。参考设计模式与开发实践第章发布订阅模式设计模式第章第节观察者模式 概述 观察者模式又叫发布 - 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫...
摘要:观察者模式维护单一事件对应多个依赖该事件的对象关系发布订阅维护多个事件主题及依赖各事件主题的对象之间的关系观察者模式是目标对象直接触发通知全部通知,观察对象被迫接收通知。 观察者模式(Observer) 观察者模式:定义了对象间一种一对多的依赖关系,当目标对象 Subject 的状态发生改变时,所有依赖它的对象 Observer 都会得到通知。 简单点:女神有男朋友了,朋友圈晒个图,甜...
摘要:观察者模式与发布订阅模式观察者模式概念一个被观察者的对象,通过注册的方式维护一组观察者对象。当被观察者发生变化,就会产生一个通知,通过广播的方式发送出去,最后调用每个观察者的更新方法。 观察者模式与发布/订阅模式 观察者模式 概念 一个被观察者的对象,通过注册的方式维护一组观察者对象。当被观察者发生变化,就会产生一个通知,通过广播的方式发送出去,最后调用每个观察者的更新方法。当观察者不...
摘要:基于写了一个涂鸦组件,说项目之前先附上几张效果图项目地址由于篇幅问题,本文先总体介绍一下项目的大概情况,重点介绍一下组件间的通信方式。一项目说明该项目是基于构建的多页应用,使用开发,以组件的方式组织代码。 基于svg写了一个涂鸦组件,说项目之前先附上几张效果图: 项目地址:SVGraffiti showImg(https://segmentfault.com/img/bVbassI?w...
阅读 3255·2023-04-26 01:31
阅读 1896·2023-04-25 22:08
阅读 3440·2021-09-01 11:42
阅读 2828·2019-08-30 12:58
阅读 2168·2019-08-29 18:31
阅读 2434·2019-08-29 17:18
阅读 3067·2019-08-29 13:01
阅读 2555·2019-08-28 18:22