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 函数速查表
Feb 07 Javascript
AngularJS学习笔记之ng-options指令
Jun 16 Javascript
真正好用的js验证上传文件大小的简单方法
Oct 27 Javascript
js格式化时间的简单实例
Nov 27 Javascript
vue中mint-ui环境搭建详细介绍
Apr 06 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
May 17 Javascript
微信小程序wx.request实现后台数据交互功能分析
Nov 25 Javascript
vue-cli3 karma单元测试的实现
Jan 18 Javascript
vueScroll实现移动端下拉刷新、上拉加载
Mar 22 Javascript
jQuery 选择器用法基础入门示例
Jan 04 jQuery
vue引入静态js文件的方法
Jun 20 Javascript
javascript自定义加载loading效果
Sep 15 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 curl选项列表(超详细)
2013/07/01 PHP
PHP分页类集锦
2014/11/18 PHP
php中判断数组相等的方法以及数组运算符介绍
2015/03/30 PHP
php写入、删除与复制文件的方法
2015/06/20 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
Javascript实现的分页函数
2006/12/22 Javascript
符合标准的js表单提交的代码
2007/09/13 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
Python的Twisted框架中使用Deferred对象来管理回调函数
2016/05/25 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
英文版银行求职信
2013/10/09 职场文书
医院实习接收函
2014/01/12 职场文书
暑期培训随笔感言
2014/03/10 职场文书
小学生感恩演讲稿
2014/04/25 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
小学教师党员承诺书
2015/04/27 职场文书
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL
Tomcat安装使用及部署Web项目的3种方法汇总
2022/08/14 Servers
MySQL数据管理操作示例讲解
2022/12/24 MySQL