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 相关文章推荐
漂亮的提示信息(带箭头)
Mar 21 Javascript
jQuery 学习入门篇附实例代码
Mar 16 Javascript
jquery下利用jsonp跨域访问实现方法
Jul 29 Javascript
JavaScript中:表达式和语句的区别[译]
Sep 17 Javascript
JS编程小常识很有用
Nov 26 Javascript
jquery和javascript的区别(常用方法比较)
Jul 04 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
Feb 19 Javascript
js实现页面跳转的五种方法推荐
Mar 10 Javascript
jQuery的层级查找方式分析
Jun 16 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
Sep 08 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
Nov 01 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
Oct 10 jQuery
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
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
PHP反射API示例分享
2016/10/08 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
JavaScript函数模式详解
2014/11/07 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
中介公司区域经理岗位职责范本
2014/03/02 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
大学生社团活动总结
2014/04/26 职场文书
国贸专业求职信
2014/06/28 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
民事辩护词范文
2015/05/21 职场文书
网络研修随笔感言
2015/11/18 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书
React如何创建组件
2021/06/27 Javascript
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python