关系介绍

为方便记忆我将真个模式主要分为三个部分:
发布者:在执行某个动作后将特定的消息发布到消息池
订阅者:将订阅的特定消息注册到消息池,并提交一个回调函数,在订阅的消息被触发时,会执行该回调函数,用于接受消息
消息池:用于存放所有所有订阅者的注册信息并在接受到发布者的消息后触发该消息下的所有回调函数

发布和订阅之间的关系没有先后之分,只要发布的消息在消息池中已经注册过,就会将当前消息类型下存放的回调函数全部执行

观察者模式关系图:

简单实例

// 页面加载后立即执行,使用闭包保证数据持久存在
var Observe = (function(){var __messages = {}return {// 订阅者注册信息接口subscribe:function(type,fn){// 判断是否有订阅者在列队 数组 中if(typeof __messages[type]==='undefined'){ //如果没有__messages[type] = [fn]}else{ // 如果已经存在相同类型的消息__messages[type].push(fn)}},// 发布消息接口fire:function(type,args){if(!__messages[type]){return;}var events = {type:type,args:args}var i = 0var len = __messages[type].lengthfor (; i < len; i++) {__messages[type][i].call(this,events) // 执行当前相同type的订阅消息}},// 移除信息接口remove:function(type,fn){ if(__messages[type] instanceof Array){var i= __messages[type].lengthfor(;i>=0;i--){__messages[type][i]===fn &&__messages[type].splice(i,1) // 从当前消息列队删除订阅}}}}})();// 订阅消息
Observe.subscribe('test',function(e){console.log(e);
})
var fn = function(e){console.log(e);
}Observe.subscribe('test1',fn)// 发布 ‘test’ 消息Observe.fire('test',{msg:'这是传递的参数'});Observe.fire('test1',{msg:'这是传递的参数1'});// 移除这则订阅消息Observe.remove('test1',fn); Observe.fire('test1',{msg:'这是传递的参数1'}); // 发布消息后也不会输出

实际应用场景

查看实例

一个模块即可以是订阅者,也可以是发布者:比如评论板块,当用户提交评论后,评论列表订阅的添加消息会触发从而增加一条展示数据,这时他是一个订阅者,当某一条评论删除的时候,他又作为一个发布者将删除消息发布出去。

观察者模式在实际的项目应用很广泛,比如vuex正是使用了该方式,在vue的响应式原理中也起到关键的作用。
贯彻着你是最主要的作用时解决类和对象之间的耦合解耦两个相互依赖的对象,使其依赖于观察者的消息机制。各模块之间只需要通过消息进行通讯,相互之间的修改不会影响到其他模块。

参考链接

【JavaScript设计模式】-观察者模式 Observe相关推荐

  1. JavaScript设计模式 - 观察者模式

    观察者模式包含观察目标和观察者俩类对象,一个目标可以有任意数目的与之相依赖的观察者,一旦观察目标的状态发生了变化,那么所有的观察者也将得到通知 当一个对象的状态发生变化的时候,所有的依赖与它的对象都将 ...

  2. javascript设计模式-观察者模式(observer pattern)

    为什么80%的码农都做不了架构师?>>>    也称作订阅发布模式,以下是 pubsubz 实现,不依赖任何库. (function ( window, doc, undef ) { ...

  3. python观察者模式observe

    python设计模式观察者模式observe 观察者模式是一个软件设计模式,一个主题对象博包涵一系列依赖他的观察者,自动通知观察者的主题对象的改变,通常会调用每个观察者的一个方法.这个设计模式非常适用 ...

  4. 设计模式(四) Observe——观察者模式

    设计模式四 Observe--观察者模式 观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于 ...

  5. 《JavaScript设计模式与开发实践》模式篇(5)—— 观察者模式

    发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状 态发生改变时,所有依赖于它的对象都将得到通知.在 JavaScript 开发中,我们一般用事件模型 来替代传统的发布- ...

  6. JavaScript设计模式之发布-订阅模式(观察者模式)-Part1

    <JavaScript设计模式与开发实践>读书笔记. 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖它的对象都将得到通知. 例如 ...

  7. JavaScript设计模式之观察者模式(学习笔记)

    设计模式(Design Pattern)对于软件开发来说其重要性不言而喻,代码可复用.可维护.可扩展一直都是软件工程中的追求!对于我一个学javascript的人来说,理解设计模式似乎有些困难,对仅切 ...

  8. javascript 设计模式之观察者模式

    什么是观察者模式 观察者模式 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个目标对象,当这个目标对象的状态发生变化时,会通知所有观察者对象,使它们能够自动更新. -- Graph ...

  9. JavaScript 设计模式核⼼原理与应⽤实践 之 行为型:策略模式——重构小能手,拆分“胖逻辑”

    JavaScript 设计模式核⼼原理与应⽤实践 之 行为型:策略模式--重构小能手,拆分"胖逻辑" 行为型:策略模式--重构小能手,拆分"胖逻辑" 策略模式和 ...

  10. 16种JavaScript设计模式(中)

    简介 上文中介绍了学习设计模式前需要了解的一些基础概念和js的基础模式-原型模式,没看过的同学可以点这里,本章将介绍以下几种模式 单例模式 策略模式 代理模式 迭代器模式 发布订阅模式 命令模式 组合 ...

最新文章

  1. OPENGFILER存储柜
  2. =在 java中怎么表示_在Java中各种类型运算符的介绍与其基本使用方式(有具体使用示例)...
  3. VueJS项目报错解决:router.map is not a function - 方法大全
  4. Docker带版本号安装Zk
  5. 解决cmd命令行窗口和 powershell 汉字显示乱码问题
  6. python安装教程-PyCharm 安装教程(Windows)
  7. 矩阵分析 (五) 矩阵的分解
  8. FastReport.Net使用:[23]图表(Chart)控件
  9. restorator打开后win10不能打开任何程序,右键桌面没有打开选项
  10. VmPlayer上设置主机和windows虚拟机文件夹共享
  11. Data Lab 2(深入理解计算机系统)
  12. 基于C++和QT实现的第三人称RPG游戏编辑器设计
  13. MySQL比较两张表数据相同、不同结果记录
  14. 加速PG中vacuum
  15. 微信小程序开发入门教程(十)
  16. 一颗白菜的云原生之旅
  17. 计算机组成原理_实验三:主存储器原理实验
  18. 宇宙的精华与大数据的失败
  19. 基于51单片机的传送带产品计数器
  20. 议题征集倒计时|Pulsar Summit Asia 2021 议题征集截至 9 月 30 日

热门文章

  1. MAC上Cisco卸载后无法重新安装的解决方法
  2. 西门子S7 200系列寄存器地址与组态王地址的换算公式
  3. 爬取妹子图(python):爬虫(bs+rq)+ gevent多线程
  4. oracle 字段补充空格,oracle表中某个字段含有字符回车、空格的手动修改方式
  5. bootstarp怎么使盒子到最右边_海美迪H7Plus电视盒子:配置喜人,还没有广告?爱了!...
  6. win7系统IE11浏览器导致页面无法点选日期解决方法:
  7. 全景效果实现(Photo Sphere,photo-sphere-viewer全景虚拟漫游)
  8. 美容行业如何制定网络营销方案,做好网络品牌推广?
  9. mySQL实现redis_Redis同步mysql实现解决方案
  10. 毕业设计选题推荐基于美容院商城服务微信小程序系统