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 相关文章推荐
$("").click与onclick的区别示例介绍
Sep 25 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 Javascript
jQuery版本升级踩坑大全
Jan 12 Javascript
js实现数组冒泡排序、快速排序原理
Mar 08 Javascript
JavaScript编写一个简易购物车功能
Sep 17 Javascript
angular十大常见问题
Mar 07 Javascript
JavaScript canvas实现围绕旋转动画
Nov 18 Javascript
Element-ui table中过滤条件变更表格内容的方法
Mar 02 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
Mar 25 jQuery
Vue使用localStorage存储数据的方法
May 27 Javascript
VSCode 配置uni-app的方法
Jul 11 Javascript
快速解决element的autofocus失效问题
Sep 08 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+DBM的同学录程序(1)
2006/10/09 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
jQuery回调函数的定义及用法实例
2014/12/23 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
2019/04/29 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
django中ImageField的使用详解
2020/12/21 Python
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
室内设计自我鉴定
2013/10/15 职场文书
某同学的自我鉴定范文
2013/12/26 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
感恩母亲节活动方案
2014/03/04 职场文书
作文批改评语大全
2014/04/23 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技