场景

我们在做地图引擎的时候,会经常扩展一些插件,有些插件会动态根据地图渲染时机等做一些计算处理重新渲染等,这时候地图渲染时机如何通知到插件,就可以用到这个发布订阅模式来进行。

定义

发布订阅模式,也称为观察者模式,多个观察者可以实时监听某一个具体对象,常见的就是js里面的事件监听。

实现

先看下引擎代码简单骨架:

class MapEngine {constructor(){//...}/**渲染函数,处理渲染等相关事项 */rander(){//省略其他执行代码...//TODO:渲染执行完毕 可以通知渲染执行完成}
}export default MapEngine

在TODO的位置可以通知相关插件地图引擎已经执行渲染完成。

这时候我们需要在构造函数里面定义一个订阅数组队列,用来存储要触发的回调函数

/**订阅的渲染处理事件 */
this._subscribeRanderEvent = []

增加订阅方法和移除订阅方法

subscribeRander(callback) {const subEnevtId = `生成唯一id`this._subscribeRanderEvent[subEnevtId] = callbackreturn {id: subEnevtId}
}
unSubscribeRander(id) {delete this._subscribeRanderEvent[id]
}

需要订阅的插件直接执行 subscribeRander 订阅,这时候在rander里面检查订阅数组并执行相应回调即可

  rander(){//省略其他执行代码...//TODO:渲染执行完毕 可以通知渲染执行完成for (const key in this._subscribeRanderEvent) {if (Object.hasOwnProperty.call(this._subscribeRanderEvent, key)) {const callback = this._subscribeRanderEvent[key]if (typeof callback === 'function') callback(_camera)}}}

总结

利用发布订阅模式,可以很方便的扩展引擎类的插件,也很大程度上不会影响原有代码和其他模块的功能逻辑,否则如果只是一个简单的callback回调,每次有新功能进来需要用到这个事件的时候都可能要找到原来的回调入口增加代码,久而久之代码维护性扩展性也会变得越来越差。

浅谈js下的发布订阅模式(观察者模式)相关推荐

  1. JS 基础篇(发布订阅模式)

    发布订阅模式的js文件 //发布者 var eventObj = {//缓存列表,存放订阅者的信息list:{},//添加订阅listen:function(key,fn){if(!this.list ...

  2. 从东京奥运会看js设计模式之发布订阅模式

    开篇废话:本篇文章介绍发布-订阅模式,想必很多人听说过有一种观察者模式,网上既有资料说这是两种不同的设计模式,也有说这是一种模式,我倾向于认同他们是同一种设计模式.不必过于纠结 开篇楔子:东京奥运会已 ...

  3. 【JavaScript】手撕前端面试题:寄生组合式继承 | 发布订阅模式 | 观察者模式

  4. 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?

    前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...

  5. python 设计模式 观察者模式(发布订阅模式)

    发布订阅模式 观察者模式应用比较广泛,又被称为"发布-订阅"模式.它用来定义对象间一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并被自动更新. 问题1 ...

  6. JS设计模式 - 观察者模式与发布/订阅模式

    观察者模式本质上是一种对象行为模式,而 发布/订阅模式本质上是一种架构模式,强调组件的作用. 1. 观察者模式 观察者模式是一种设计模式,其中一个对象(称为主体)根据对象(观察者)维护一个对象列表,自 ...

  7. JS观察者模式和发布订阅模式

    观察者模式 观察者模式在前端工程中是很常见的设计模式,因为前端交互中充斥着大量多控件联动的交互,当参与联动的组件数量比较多或者组件数量可能变化的时候,代码就会变得难以维护.但是如果我们写代码时遵循了观 ...

  8. 发布订阅模式 仿写Vue事件监听手写js实现

    Vue组件中,可以使用 $emit,$on,$off 分别来分发.监听.取消监听事件实现组件通信,比较方便: 最近空闲时间手撸代码实现了发布订阅模式,可以进行组件通信. 话不多说,直接上代码 /*** ...

  9. JS设计模式七:发布-订阅模式

    发布-订阅模式简述 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 以网购为例: 假 ...

最新文章

  1. Mycat简单实现读写分离与分库分表
  2. static/final/常量模式
  3. 科大星云诗社动态20210318
  4. swiper轮播器的常用案例分析(swiper hover停止mouseover停止)
  5. 跨时钟域电路设计——结绳法
  6. android monitor突然不能显示
  7. [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程
  8. c++函数返回多个值_Excel函数技巧之返回多个匹配结果
  9. 软件质量测试一般方法
  10. Codeblocks下载、安装的详细过程
  11. vnc下:无法执行默认的终端模拟器
  12. 笔记本电脑外接显示器 卡_如何向Mac笔记本电脑添加和配置外接显示器
  13. 算法和刷题——二分法
  14. php.krab病毒,SQLServer数据库中了勒索病毒加密,扩展名改为Globeimposter-Alpha666qqz
  15. Unity BIM模型导入调研
  16. 看完这篇还不懂高并发中的线程与线程池你来打我
  17. 氖星数字人口型、动作、表情接口
  18. 对搜索引擎不友好的网站具有怎样的特点呢
  19. pets vs cattle
  20. 怎么重新编译CE5.6?

热门文章

  1. 自适应复化辛普森公式求积算法(C语言实现)
  2. 能被9和11整除的数的特征
  3. zabbix php问题 Call to undefined function array_column()
  4. [附源码]Java计算机毕业设计SSM高校体育馆管理信息系统
  5. java 文档处理界面_java – 如何设置Word文档的页面方向?
  6. 基于机器学习算法对电动汽车续驶里程进行估计
  7. python-函数(function)
  8. 计算器(可随意编辑)
  9. string转换long
  10. 如何实现一个“线程池”