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去除空格的几种方法
Oct 03 Javascript
Jquery 滑入滑出效果实现代码
Mar 27 Javascript
js的隐含参数(arguments,callee,caller)使用方法
Jan 28 Javascript
js树插件zTree获取所有选中节点数据的方法
Jan 28 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
Apr 20 Javascript
javascript图片预加载完整实例
Dec 10 Javascript
jquery按回车键实现表单提交的简单实例
May 25 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
Aug 01 Javascript
Angular2  NgModule 模块详解
Oct 19 Javascript
jquery dataTable 获取某行数据
May 05 jQuery
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
Sep 20 jQuery
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
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的字符串用法小结
2010/06/08 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
php数组指针操作详解
2017/02/14 PHP
Javascript 继承机制实例
2009/08/12 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
jquery中each循环的简单回滚操作
2017/05/05 jQuery
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
加速vue组件渲染之性能优化
2020/04/09 Javascript
jQuery实现可以扩展的日历
2020/12/01 jQuery
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
python中加背景音乐如何操作
2020/07/19 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
初二学习计划书范文
2014/04/27 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
大学生读书笔记范文
2015/07/01 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
初中毕业感言300字
2015/07/31 职场文书
安全教育主题班会总结
2015/08/14 职场文书