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 相关文章推荐
Javascript实现颜色rgb与16进制转换的方法
Apr 18 Javascript
JQuery查找DOM节点的方法
Jun 11 Javascript
javaScript实现滚动新闻的方法
Jul 30 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
Sep 23 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
Oct 29 Javascript
jquery插件锦集【推荐】
Dec 16 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
Jan 19 Javascript
简单易懂的天气插件(代码分享)
Feb 04 Javascript
浅谈JS对象添加getter与setter的5种方法
Jun 09 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
May 12 Javascript
node 解析图片二维码的内容代码实例
Sep 11 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
Sep 19 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
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
php中文繁体和简体相互转换的方法
2015/03/21 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
Symfony控制层深入详解
2016/03/17 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
火狐4、谷歌12不支持Jquery Validator的解决方法分享
2011/06/20 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
Angular.js前台传list数组由后台spring MVC接收数组示例代码
2017/07/31 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
EL表达式截取字符串的函数说明
2017/09/22 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
node后端服务保活的实现
2019/11/10 Javascript
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
2016/04/27 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
Flask框架web开发之零基础入门
2018/12/10 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
《春到梅花山》教学反思
2014/04/16 职场文书
抽样调查项目计划书
2014/04/24 职场文书
征兵宣传标语
2014/06/20 职场文书
护士求职信
2014/07/05 职场文书
党校个人总结
2015/03/04 职场文书
2015年小学校长工作总结
2015/05/19 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python