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 相关文章推荐
JS中 用户登录系统的解决办法
Apr 15 Javascript
jquery 追加tr和删除tr示例代码
Sep 12 Javascript
Jsonp post 跨域方案
Jul 06 Javascript
JavaScript函数柯里化详解
Apr 29 Javascript
js和C# 时间日期格式转换的简单实例
May 28 Javascript
jQuery动态移除和添加背景图片的方法详解
Mar 07 Javascript
微信小程序自定义组件
Aug 16 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
Dec 28 Javascript
js 取消页面可以选中文字的功能方法
Jan 02 Javascript
JavaScript生成指定范围的时间列表
Mar 19 Javascript
java实现单链表增删改查的实例代码详解
Aug 30 Javascript
Javascript 解构赋值详情
Nov 17 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获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
python 实现文件的递归拷贝实现代码
2012/08/02 Python
详解Python网络爬虫功能的基本写法
2016/01/28 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
python使用RNN实现文本分类
2018/05/24 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
英语商务邀请函范文
2014/01/16 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
营业员岗位职责范本
2015/04/14 职场文书
车间安全生产管理制度
2015/08/06 职场文书
优秀党员先进事迹材料2016
2016/02/29 职场文书
血轮眼轮回眼特效 html+css
2021/03/31 HTML / CSS
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang