JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例


Posted in Javascript onJuly 27, 2018

本文实例讲述了JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法。分享给大家供大家参考,具体如下:

观察者模式,又称为发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己的状态。

在观察者模式中,并不是一个对象调用另一个对象的方法,而是一个对象订阅另一个对象的特定活动并在状态改变后获得通知。订阅者也称为观察者,而被观察的对象称为发布者或主题。当发生了一个重要的事件时,发布者将会通知(调用)所有订阅者并且可能经常以事件对象的形式传递消息。

思路:

① 发布者需要一个数组类型的属性subscribers,以存储所有的订阅者;

② 订阅subscribe():将新的订阅者加入到这个数组中去;

③ 退订unsubscribe():从订阅者数组中删除某个订阅者;

④ 发布publish():循环遍历subscribers数组中的每一个元素,并通知他们,即发送消息,意味着调用订阅者的某个方法。因此,当用户订阅信息时,该订阅者需要向subscribe()提供它的其中一个方法。

subscribe()unsubscribe()publish()三种方法都需要一个type参数,因为发布者可能触发多个事件,而用户可能仅选择订阅其中一种,而不是另外一种。

使用观察者模式的好处:

① 支持简单的广播通信,自动通知所有已经订阅过的对象。

② 页面载入后目标对象很容易与观察者存在一种动态关联,增加了灵活性。

③ 目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用。

在JavaScript中,一般使用事件模型来替代传统的观察者模式。 DOM事件,也是JavaScript和DOM之间实现的一种观察者模式。

Eg1:

监听用户单击按钮的动作,但没有办法预知用户将在什么时候点击。因此,订阅按钮上的click事件,当按钮被点击时,便向订阅者发布此消息。

btn.addEventListener("click", function() {
    console.log("First click");
}, false);
// 可以有多个订阅者
btn.addEventListener("click", function() {
    console.log("Second click");
}, false);
btn.click();

Eg2:

非观察者模式:

$.ajax({
  url: './login',
  type: 'post',
  contentType: 'application/json',
  dataType:'json',
  success: function(data) {
    if(data.status === "success") { // 登录成功,渲染header、footer
      header.setInfo(data.headerInfo);
      footer.setInfo(data.footerInfo);
    }
  }
});

观察者模式:

$.ajax({
  ...,
  success: function(data) {
    if(data.status === "success") {
      // 登录成功,发布登陆成功消息
      login.trigger("loginsuccess", data);
    }
  }
});
var header = (function() { // 监听消息
  login.listen("loginsuccess", function(data){
    header.setInfo(data.headerInfo);
  });
  return {
    setInfo: function(data) {
      console.log("渲染header");
    }
  };
})();
var footer = (function() {
  login.listen("loginsuccess", function(data){
    footer.setInfo(data.navInfo);
  });
  return {
    setInfo: function(data) {
      console.log("渲染nav");
    }
  };
})();

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
正则表达式语法
Oct 09 Javascript
基于jquery的让页面控件不可用的实现代码
Apr 27 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
Sep 30 Javascript
js保留小数点后几位的写法
Jan 03 Javascript
js计算任意值之间随机数的方法
Jan 16 Javascript
js实现简单折叠、展开菜单的方法
Aug 28 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
Jan 17 Javascript
Node.js服务器开启Gzip压缩教程
Aug 11 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
Oct 26 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
Oct 26 Javascript
详解jQuery获取特殊属性的值以及设置内容
Nov 14 jQuery
JavaScript从原型到原型链深入理解
Jun 03 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
Jul 26 #Javascript
Vue头像处理方案小结
Jul 26 #Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
Jul 26 #Javascript
vue router 配置路由的方法
Jul 26 #Javascript
vue+webpack模拟后台数据的示例代码
Jul 26 #Javascript
JavaScript设计模式之工厂模式和抽象工厂模式定义与用法分析
Jul 26 #Javascript
vue父组件异步获取数据传给子组件的方法
Jul 26 #Javascript
You might like
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
javascript JSON操作入门实例
2010/04/16 Javascript
Jquery replace 字符替换实现代码
2010/12/02 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
vue-router单页面路由
2017/06/17 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
react 生命周期实例分析
2020/05/18 Javascript
python 图片验证码代码分享
2012/07/04 Python
用Python进行行为驱动开发的入门教程
2015/04/23 Python
Python文本特征抽取与向量化算法学习
2017/12/22 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
Python实现的堆排序算法示例
2018/04/29 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
python实现可变变量名方法详解
2019/07/01 Python
Python实现最常见加密方式详解
2019/07/13 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
师德师风演讲稿
2014/05/05 职场文书
个人违纪检讨书
2014/09/15 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
三年级作文之趣事作文
2019/11/04 职场文书