热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript中的观察者模式

前言:在各种设计模式中,观察者模式具有很重要的应用,比如前端很流行的框架Vue.js就是基于观察者模式实现的,最近也了解了下

前言:在各种设计模式中,观察者模式具有很重要的应用,比如前端很流行的框架Vue.js就是基于观察者模式实现的,最近也了解了下观察者模式的实现原理,简单的说就是一个对象改变了,观察者察觉到了这种改变,它将这种改变通知给所有和这个对象有关的函数,然后这些函数被调用并执行。



一. 观察者模式的实现原理

如前言中所说,观察者具有观察和通知的职责,那么它是如何来实现这两个职责的呢?

所谓观察和通知,就是一旦数据变化就立马发起关于这个数据改变的通知,那么问题又来了,通知给谁看呢?聪明的你肯定一下子就想到了,当然是给关心这个数据变化的某某看了,某某收到通知后就可以去发表自己的见解了。所以我们可以这样理解:


(1)要想把改变通知出去,必须要有相应的通知的方法;

(2)通知发布出去,得有人看,每个人都是一个订阅者,所以必须得有添加订阅者的方法;

(3)订阅之后又不感兴趣了,就可以取消订阅,所以又有了一个取消订阅的方法。


实现代码:

var observer &#61; {//添加订阅者addSubscriber: function (callback) {this.subscribers[this.subscribers.length] &#61; callback;},//移除订阅者removeSubscriber: function (callback) {for (var i &#61; 0; i <this.subscribers.length; i&#43;&#43;) {if (this.subscribers[i] &#61;&#61;&#61; callback) {delete (this.subscribers[i]); //删除某个订阅者}}},//发布通知publish: function (data) {for (var i &#61; 0; i <this.subscribers.length; i&#43;&#43;) {if (typeof this.subscribers[i] &#61;&#61;&#61; &#39;function&#39;) {this.subscribers[i](data); //执行和data相关的操作}}}
};

我们可以看到在观察者的内部有个订阅者的数组&#xff0c;关于添加、删除、通知都是针对这个数组来操作的&#xff0c;每个订阅者都执行的是和data相关的操作&#xff0c;即只要data改变&#xff0c;每个订阅者的方法都会被调用。

二. 代码演示

上面的代码主要讲的是观察者如何实现&#xff0c;下面来看下如何订阅、发布、删除&#xff1a;
&#xff08;1&#xff09;创建一个观察者&#xff1a;

function CreateObserver(){var obj &#61; {};for (var i in observer){obj[i] &#61; observer[i];}obj.subscribers &#61; []; //添加一个订阅者数组return obj;
}
var weather &#61; CreateObserver();

&#xff08;2&#xff09;添加订阅&#xff1a;

如上面我们创建了一个叫做天气的观察者&#xff0c;最近西安的温度40&#43;&#xff0c;天气想知道人们的感受&#xff0c;所以就发布了一条关于天气的帖子&#xff0c;并订阅了形形色色的关于他的评价&#xff1a;

var someWords &#61; [&#39;北郊说&#xff1a;下雨之后&#xff0c;从红烧变清蒸&#xff01;&#39;, &#39;西安人民说&#xff1a;我与铁板烧之前只差一撮孜然&#xff01;&#39;, &#39;非洲同胞说&#xff1a;欢迎来非洲避暑&#xff01;&#39;, &#39;吐鲁番说&#xff1a;地表温度67&#xff0c;我终于不是第一了&#xff0c;哈哈哈。。。&#39;];var func &#61; [];for (let i &#61; 0; i function (title){console.log(title &#43; "---" &#43;someWords[i]);}weather.addSubscriber(func[i]);
}weather.publish(&#39;西安地表温度67&#xff0c;全国第一&#xff01;热热热&#39;);

输出如下&#xff1a;

这里写图片描述

只想说一句&#xff0c;是真的热&#xff01;&#xff01;&#xff01;&#xff01;

&#xff08;3&#xff09;取消订阅

天气觉得吐鲁番堕落了&#xff0c;不是第一还这么开心&#xff0c;我要取消对他的订阅&#xff1a;

weather.removeSubscriber(func[3]);weather.publish(&#39;西安地表温度67&#xff0c;全国第一&#xff01;热热热&#39;);

所以输出就这样了&#xff1a;

这里写图片描述



以上是本人对观察者模式的理解&#xff0c;我觉得它的实现巧妙的地方在于在内部维护了一个数组&#xff0c;这个数组是关于某个数据变化后的所有回调函数&#xff0c;当数据变化后逐一去执行这些回调函数&#xff0c;既可以去统一管理数组成员&#xff0c;又可以让数组成员去干自己的事情。


推荐阅读
  • 【Vue基础】监听属性watch
    Vue监听属性是watch,我们可以通过watch来响应数据的变化。代码示例: ... [详细]
  • javascript二叉树基本功能实现
    都是常用的功能。删除是最复杂的。。test ... [详细]
  • Vue.Js_Vue之vue.js声明式渲染
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Vue之vue.js声明式渲染相关的知识,希望对你有一定的参考价值。ht ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • #ReactivityFundamentals#DeclaringReactiveState ... [详细]
  • vue.js如何实现数据的双向绑定呢?与angular不同。vue利用的是es5的defineproperty特性。1.一个小例子 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 认识Vue关于Vue的描述有不少,不外乎都会拿来与Angular和React对比,同样头顶MVVM双向数据驱动设计模式光环的Angular自然被对比的最多,但到目前为止,Angul ... [详细]
author-avatar
杨胤才_669
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有