再谈观察者模式的具体应用,如监听一个class其中一个属性,如websocket中onmessage的实现

本文主要是介绍再谈观察者模式的具体应用,如监听一个class其中一个属性,如websocket中onmessage的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

再谈观察者模式的具体应用,如监听一个class其中一个属性,如websocket中onmessage的实现

概述

在JavaScript中,观察者模式是一种设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,所有依赖于它的观察者都会得到通知并被自动更新。

观察者模式通常包含以下几个角色:

  1. Subject(主题):维护一系列的观察者,提供注册和删除观察者的方法,并在状态发生改变时通知所有注册的观察者。

  2. Observer(观察者):定义一个更新接口,使得在接收到主题通知时能够执行相应的操作。

下面是一个简单的JavaScript观察者模式的实现示例:

javascript
Copy code
// 主题对象
class Subject {constructor() {this.observers = []; // 存储观察者}// 注册观察者addObserver(observer) {this.observers.push(observer);}// 移除观察者removeObserver(observer) {this.observers = this.observers.filter(obs => obs !== observer);}// 通知所有观察者notify() {this.observers.forEach(observer => observer.update());}
}// 观察者对象
class Observer {constructor(name) {this.name = name;}// 更新方法update() {console.log(`${this.name} 收到更新通知`);}
}// 使用观察者模式
const subject = new Subject();const observer1 = new Observer('Observer 1');
const observer2 = new Observer('Observer 2');subject.addObserver(observer1);
subject.addObserver(observer2);// 主题状态发生改变,通知所有观察者
subject.notify();// 输出:
// Observer 1 收到更新通知
// Observer 2 收到更新通知

在这个例子中,Subject是主题对象,负责维护观察者列表,并提供注册、移除和通知观察者的方法。Observer是观察者对象,实现了一个更新方法,用于在接收到通知时执行相应的操作。

通过这种模式,你可以轻松地添加或移除观察者,而且主题状态发生改变时,所有观察者都会得到通知。这在实现一些事件驱动的系统或 UI 组件中是非常常见的。

应用1

  1. 需求:
    定义一个class,class里面有一个成员state,通过onchange监听到state的变化
  2. 实现:
    可以使用 getter 和 setter 方法来实现对 state 成员的监听。通过在 setter 方法中触发一个自定义事件,然后让外部通过 onchange 事件来监听状态的变化。
class StatefulClass {constructor() {this._state = null; // 使用下划线表示这是一个私有属性this._changeListeners = []; // 存储监听器的数组}// 定义 state 的 getter 方法get state() {return this._state;}// 定义 state 的 setter 方法set state(newState) {if (this._state !== newState) {this._state = newState;this.notifyChange(); // 当 state 变化时触发通知}}// 添加监听器onchange(callback) {this._changeListeners.push(callback);}// 通知所有监听器状态变化notifyChange() {this._changeListeners.forEach(callback => {callback(this._state);});}
}// 使用示例
const myInstance = new StatefulClass();// 添加监听器
myInstance.onchange((newState) => {console.log('State changed:', newState);
});// 修改 state,会触发监听器
myInstance.state = 'New State'; // 输出: State changed: New State

在这个示例中,StatefulClass 类有一个私有的 _state 属性和一个存储监听器的数组 _changeListeners。onchange 方法用于添加监听器,notifyChange 方法用于通知所有监听器。当 state 发生变化时,setter 方法会触发 notifyChange 方法,通知所有监听器。

应用2

应用1中的onchange是一个函数,可是我们看到websocket中使用的时候是一个这种形式onmessage = (e) => { },这种ws.onmessage=(e)=>{}这种赋值语句是怎么实现的监听呢?

在 JavaScript 中,onmessage 和类似的属性赋值语法实际上是使用属性存取器(Property Accessors)来实现的。这种语法允许你为一个对象的属性定义 getter 和 setter 方法。当你访问或设置这个属性时,相应的 getter 或 setter 将被调用。

在 WebSocket 中,onmessage 是一个属性,但它的赋值语法隐藏了底层的 getter 和 setter。这样的属性通常是事件属性,它允许你注册或移除事件处理函数。

以下是一个简化的示例,演示了如何在对象中使用属性存取器:

class Example {constructor() {this._messageHandler = null; // 私有属性}// 定义 onmessage 的 getter 方法get onmessage() {return this._messageHandler;}// 定义 onmessage 的 setter 方法set onmessage(handler) {this._messageHandler = handler;}
}// 使用示例
const myExample = new Example();// 设置 onmessage 处理函数
myExample.onmessage = (e) => {console.log('Message received:', e.data);
};// 获取 onmessage 处理函数
const messageHandler = myExample.onmessage;// 调用处理函数
if (messageHandler) {messageHandler({ data: 'Example message' });
}

在这个示例中,Example 类有一个私有的 _messageHandler 属性,通过定义 onmessage 的 getter 和 setter 方法,你可以像使用普通属性一样使用 onmessage。当你设置 onmessage 时,实际上调用了 setter 方法,当你获取 onmessage 时,实际上调用了 getter 方法。在 WebSocket 中,这种语法的目的是提供一种简洁的方式来处理事件。

这篇关于再谈观察者模式的具体应用,如监听一个class其中一个属性,如websocket中onmessage的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/525469

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专