JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例

 更新时间:2018年07月27日 08:49:50   作者:筱葭  
这篇文章主要介绍了JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法,结合实例形式分析了JavaScript观察者模式概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下

本文实例讲述了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中Object使用详解

    javascript中Object使用详解

    这篇文章主要介绍了javascript中Object使用详解,非常全面详尽,有需要的小伙伴参考下
    2015-01-01
  • javascript定义函数的方法

    javascript定义函数的方法

    javscript中定义和声明函数有三种方式:正常方法 构造函数 函数直接量。
    2010-12-12
  • Typescript3.9 常用新特性一览(推荐)

    Typescript3.9 常用新特性一览(推荐)

    这篇文章主要介绍了Typescript3.9 常用新特性一览,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 微信小程序实现经典window扫雷游戏

    微信小程序实现经典window扫雷游戏

    这篇文章主要为大家详细介绍了微信小程序实现经典window扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • javascript设计模式 – 备忘录模式原理与用法实例分析

    javascript设计模式 – 备忘录模式原理与用法实例分析

    这篇文章主要介绍了javascript设计模式 – 备忘录模式,结合实例形式分析了javascript备忘录模式相关概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • js中函数声明与函数表达式

    js中函数声明与函数表达式

    js的解析器对函数声明与函数表达式并不是一视同仁地对待的。对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析,而函数表达式,如同定义其它基本类型的变量一样,只在执行到某一句时也会对其进行解析,
    2015-06-06
  • JS实现进入页面时渐变背景色的方法

    JS实现进入页面时渐变背景色的方法

    这篇文章主要介绍了JS实现进入页面时渐变背景色的方法,涉及javascript操作css控制背景色渐变的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 整理关于Bootstrap表单的慕课笔记

    整理关于Bootstrap表单的慕课笔记

    这篇文章主要为大家整理了关于Bootstrap表单的慕课笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  •  typeScript入门基础介绍

     typeScript入门基础介绍

    这篇文章主要介绍了 typeScript入门基础,TypeScript 是由微软开发的开源、跨平台的编程语言,是 javaScript 的超集,最终被编译为 javaScript代码。常常被简称为TS支持JS、ES语法,下文将继续其他基础介绍,需要的朋友可以参考一下
    2022-02-02
  • javascript定时保存表单数据的代码

    javascript定时保存表单数据的代码

    我相信有不少TX用过QQ或163的邮箱吧?他们中有一个比较有用且有趣的功能,如果您在编写邮件,那在固定一个时间频率内,它会自动将您的邮件内容保存起来,以免丢失。
    2011-03-03

最新评论