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的动态删除Table表格的行和列的代码
May 12 Javascript
jQuery点击后一组图片左右滑动的实现代码
Aug 16 Javascript
js showModalDialog参数的使用详解
Jan 07 Javascript
通过隐藏iframe实现文件下载的js方法介绍
Feb 26 Javascript
jQuery中noconflict函数的实现原理分解
Feb 03 Javascript
超赞的jQuery图片滑块动画特效代码汇总
Jan 25 Javascript
Bootstrap实现水平排列的表单
Jul 04 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
Aug 04 Javascript
微信小程序 聊天室简单实现
Apr 19 Javascript
jQuery使用ajax_动力节点Java学院整理
Jul 05 jQuery
vue2.0组件之间传值、通信的多种方式(干货)
Feb 10 Javascript
浅析Vue项目中使用keep-Alive步骤
Jul 27 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
PHP sprintf()函数用例解析
2011/05/18 PHP
php无限遍历文件夹示例分享
2014/03/04 PHP
十幅图告诉你什么是PHP引用
2015/02/22 PHP
Ext 表单布局实例代码
2009/04/30 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
深入理解JavaScript系列(36):设计模式之中介者模式详解
2015/03/04 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
python的即时标记项目练习笔记
2014/09/18 Python
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
Django 登陆验证码和中间件的实现
2018/08/17 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
PageFactory设计模式基于python实现
2020/04/14 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
五型班组建设方案
2014/02/10 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
竞赛口号大全
2014/06/16 职场文书
母亲节感言
2015/08/03 职场文书
浅谈react useEffect闭包的坑
2021/06/08 Javascript
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
Springboot集成阿里云OSS上传文件系统教程
2021/06/28 Java/Android