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 相关文章推荐
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
Oct 20 Javascript
jQuery 1.8 Release版本发布了
Aug 14 Javascript
jQuery大于号(>)选择器的作用解释
Jan 13 Javascript
快速解决js开发下拉框中blur与click冲突
Oct 10 Javascript
js 判断附件后缀的简单实现方法
Oct 11 Javascript
jQuery-mobile事件监听与用法详解
Nov 23 Javascript
JavaScript 函数的定义-调用、注意事项
Apr 16 Javascript
微信小程序实现人脸识别
May 25 Javascript
element-ui 中的table的列隐藏问题解决
Aug 24 Javascript
vue实现随机验证码功能的实例代码
Apr 30 Javascript
vue+element实现表单校验功能
May 20 Javascript
layer.js open 隐藏滚动条的例子
Sep 05 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
跟我学小偷程序之成功偷取首页(第三天)
2006/10/09 PHP
我的论坛源代码(二)
2006/10/09 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
php下Memcached入门实例解析
2015/01/05 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
PHP内置加密函数详解
2016/11/20 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
DOM相关内容速查手册
2007/02/07 Javascript
javascript 写的一个简单的timer
2009/07/30 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
iframe实用操作锦集
2014/04/22 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
python字符串连接的N种方式总结
2014/09/17 Python
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
私有程序集与共享程序集有什么区别
2013/04/05 面试题
争论的故事教学反思
2014/02/06 职场文书
机修工工作职责
2014/02/21 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
化学工程专业求职信
2014/08/10 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
学校教代会开幕词
2016/03/04 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL