提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 什么是观察者模式
  • 一、观察者模式包含两大角色
  • 二、JavaScript样例
    • 1.天气(被观察对象)
    • 2.观察者(接收消息提示)
    • 3.测试代码
  • 总结
    • 被观察包含设计要素
    • 观察者包含包含设计要素

什么是观察者模式

观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。


一、观察者模式包含两大角色

设计一个观察者模式需要设计两大重要角色:
* 被观察者,当自身状态改变时能够自动向观察它的对象发送消息
* 观察者, 它接收被观察者发送的消息

二、JavaScript样例

1.天气(被观察对象)

我们根据观察者模式的形式设计一个天气信息,当天气信息更新的时候,观察者就是接收消息的对象会收到消息提示。
代码如下(示例):

        /*** 观察者模式*///观察对象,天气function Weather(date, temp) {this.date = date; //日期this.temp = temp;  //气温this.observers = [];  //观察者列表this.getTemp = function () {return this.temp;};this.setTemp = function (tmp) {this.temp = tmp;this.notify();};//注册观察者this.attach = function (observer) {console.log(observer.name + "订阅了天气预报!");this.observers.push(observer);};//发送消失提示this.notify = function () {this.observers.forEach((observer) => {observer.update(this);});}}

2.观察者(接收消息提示)

接收天气预报的观察者,可以接收天气预报信息,也可以根据讯息处理一些相关任务。
代码如下(示例):

//观察者function Observer(name, weather) {this.name = name;            //观察者自身属性this.weather = weather;     //被观察对象this.weather.attach(this);  //创建观察者同时就订阅了被观察对象this.effects = [];          //这里也可以存储观察者自己需要处理的任务队列this.update = function (weather) {console.log(this.name + "收到了天气预报通知: 今天日期"+weather.date+"  天气温度"+weather.temp+"度");this.effects.forEach(obj=>{//do something for obj//这里其实他自身又可以成为了另一个被观察者向其他观察者观察的对象。})}//添加任务this.addEffects = function (effect) {this.effects.add(effect);}}

3.测试代码

代码如下(示例):

     //创建天气预报let wea1 = new Weather("20230310", 28);//创建3个观察者接收天气预报let obj1 = new Observer("obj1", wea1);let obj2 = new Observer("obj2", wea1);let obj3 = new Observer("obj3", wea1);//输出//obj1订阅了天气预报!//obj2订阅了天气预报!//obj3订阅了天气预报!//第一种发布方式,通过自定义的设置温度方法这个方法里调用了this.notify();wea1.setTemp(20);//第二种方式发布,使用了代理方式拦截了对象的set方法let proxy = new Proxy(wea1,{set});function set(target, key, value, receiver){Reflect.set(target, key, value, receiver);target.notify();}proxy.temp = 30;//输出//obj1收到了天气预报通知: 今天日期20230310  天气温度30度//obj2收到了天气预报通知: 今天日期20230310  天气温度30度//obj3收到了天气预报通知: 今天日期20230310  天气温度30度

总结

通过观察我们发现只要观察者和被观察者只要包含一下设计元素,就能成功一个成功的观察者模型

被观察包含设计要素

1. 数组或列表用来存储观察者对象
2. 消失提示方法notify(), 循环观察者列表发送消息

观察者包含包含设计要素

1. 接收被观察者方法update()

JavaScript实现观察者模式案例相关推荐

  1. javascript 的观察者模式的原理和集线器

    学习之前先看一张图. 这张图片很形象的说明了观察者模式的工作原理.其中最左边那台电脑是信号发起者,我们叫它广播者,所有电脑都是信息接受者(包括最左边的广播者).我们称之为监听者.唯一的缺憾是这张图片是 ...

  2. HTML+CSS+JavaScript网页制作案例教程-黑马程序员-第五章课后习题(课程介绍专栏效果)

    黑马程序员编著的教材  HTML+CSS+JavaScript网页制作案例教程 第五章:"课程介绍"专栏-课后习题参考代码 题目原型: 请结合给出的素材,运用列表标记,超链接标记以 ...

  3. javaScript中createElement案例

    javaScript中createElement案例 <!DOCTYPE html> <html> <head> <meta charset="UT ...

  4. HTML+CSS+JavaScript网页制作案例教程-黑马程序员-第四章课后习题(播放器图标)

    黑马程序员编著的教材  HTML+CSS+JavaScript网页制作案例教程 第四章:播放器图标-课后习题参考代码 ........ 记得 关注,收藏,评论哦,作者将持续更新.... 我自己做的效果 ...

  5. JavaScript循环打印案例

    JavaScript循环打印案例 一.打印5行5列 * 运行代码 var str = '';for (var i = 1; i <= 5; i++) {//外部控制换行for (var j = ...

  6. javaScript动画项目案例

    javaScript动画项目案例 示例代码:我的github demo效果演示示例:我的demo网站 1.动画库编写 匀速运动 案例一 效果:匀速运动 <!DOCTYPE html> &l ...

  7. javascript操作表格案例讲解

    本案例是一个简单表格,通过javascript DOM相关技术,实现对表格的删除更改.案例代码详细的表达了思路分析,适合DOM初学者. <!doctype html> <html l ...

  8. JavaScript:综合案例-表单验证

    综合案例:表单验证 开发要求: 要求定义一个雇员信息的增加页面,例如页面名称为"emp_add.htmnl",而后在此页面中要提供有输入表单,此表单定义要求如下: .雇员编号:必须 ...

  9. JavaScript 面向对象(二) —— 案例篇

    案例--面向对象的选项卡:把面向过程的程序一步步改成面向对象的形式,使其能够更加的通用(但是通用的东西,一般会比较臃肿). 下面是一个简单的选项卡,也是我们常见的面向过程的创建形式. 1 <!D ...

最新文章

  1. hashmap是线程安全的吗?怎么解决?_解决SimpleDateFormat线程安全问题
  2. 回收 PV - 每天5分钟玩转 Docker 容器技术(152)
  3. 工作小记(三)----说说北京生活的乐趣
  4. 一个httpwebrequest异步下载的例子
  5. libpcap-mmap分析(五)
  6. golang中的文件读写
  7. python 利用 for ... else 跳出双层嵌套循环
  8. qchart 坐标轴设置_实战PyQt5: 156-QChart图表之更换图表主题
  9. Class 17 - 1 动态渲染页面爬取 — Selenium使用
  10. tensorflow object detection API训练错误解决
  11. c语言 百钱买百鸡问题
  12. 为什么用Object.prototype.toString.call(obj)检测对象类型?
  13. Spring Cloud 5分钟搭建教程(附上一个分布式日志系统项目作为参考) - 推荐
  14. 防止ASP.NET按钮多次提交的办法
  15. 较流行的4个开源协议
  16. 数控机床属于计算机应用领域,数控技术都应用到这些领域了!你还不知道!
  17. 抑郁自评量表SDS问卷HTML版
  18. 经常使用的几种OCR文档扫描工具|无水印|避免智商税
  19. ubuntu开机后nvidia驱动突然消失,nvidia显卡驱动卸载与安装
  20. Object.entries()方法的使用和实现

热门文章

  1. TCP的三次握手过程图解
  2. html渲染引擎开发,数据可视化初探-从零开始开发一个渲染引擎概述
  3. html大学生活主题班会,大学生主题班会策划书
  4. tomcat 部署vue前端项目_Tomcat部署vue项目
  5. 20块钱的逻辑分析仪使用体验
  6. 《机构投资的创新之路》读书笔记2(第4章):投资组合管理工具
  7. 开源软件geoserver使用指南
  8. 什么蓝牙耳机音质好?音质好的入耳式耳机推荐
  9. Linux 默认页大小
  10. Vue 人资 实战篇八 权限设计 重点!!!路由访问权限,左侧导航栏显示等等,还有 mixin 混入方法