当前位置: 首页 > news >正文

观察者模式和发布订阅模式

观察者模式与发布订阅模式的区别:
1、观察者模式中只有观察者和被观察者,发布订阅模式中有发布者、订阅者、调度中心
2、观察者模式是被观察者发生变化时自己通知观察者,发布订阅模式是通过调度中心来进行分布订阅操作

发布订阅模式

class EventBus {constructor() {this.events = {}; // 存储事件及其对应的回调函数列表}// 订阅事件subscribe(eventName, callback) {this.events[eventName] = this.events[eventName] || []; // 如果事件不存在,创建一个空的回调函数列表this.events[eventName].push(callback); // 将回调函数添加到事件的回调函数列表中}// 发布事件publish(eventName, data) {if (this.events[eventName]) {this.events[eventName].forEach(callback => {callback(data); // 执行回调函数,并传递数据作为参数});}}// 取消订阅事件unsubscribe(eventName, callback) {if (this.events[eventName]) {this.events[eventName] = this.events[eventName].filter(cb => cb !== callback); // 过滤掉要取消的回调函数}}
}
const eventBus = new EventBus()
eventBus.subscribe('add', () => {})

观察者模式

 ​​class Dom {​​​​    constructor() {​​
​​        // 订阅事件的观察者​​
​​        this.events = {}​​}​​/**​​​​    * 添加事件的观察者​​
​​     * @param {String} event  订阅的事件​​​​    * @param {Function} callback 回调函数(观察者)​​​​    */​​​​    addEventListener(event, callback) {​​​​        if (!this.events[event]) {​​this.events[event] = []​​
​​        }​​​​        this.events[event].push(callback)​​}​​​​    removeEventListener(event, callback) {​​if (!this.events[event]) {​​return​​
​​        }​​​​       const callbackList = this.events[event]​​const index = callbackList.indexOf(callback)​​​​            if (index > -1) {​​​​            callbackList.splice(index, 1)​​​​        }​​}​​​​    /**​​
​​    	* 触发事件​​​​    	* @param {String} event​​​​    */​​​​    fireEvent(event) {​​​​        if (!this.events[event]) {​​
​​            return​​
​​        }​​​​        this.events[event].forEach(callback => {​​​​            callback()​​})​​
​​    }​​​​}​​​​const handler = () => {​​​​   console.log('fire click')​​​​}​​​const dom = new Dom()​​dom.addEventListener('click', handler)​​
​​dom.addEventListener('move', function() {​​console.log('fire click2')​​​})​​
​​dom.fireEvent('click')​​
http://www.lryc.cn/news/123895.html

相关文章:

  • 利用ViewModel和LiveData进行数据管理
  • 前后端分离------后端创建笔记(05)用户列表查询接口(下)
  • 浅谈GIS和三维GIS的区别?
  • ArcGIS Maps SDK for JavaScript系列之三:在Vue3中使用ArcGIS API加载三维地球
  • 设计列表和超链接
  • rust包跨平台编译,macbook ,linux
  • JAVA集合-List
  • Python|OpenCV-绘制图形和添加文字的方法(2)
  • 使用GO编译wasm文件并在nodejs中使用
  • BM22 比较版本号
  • 【Java】Maven配置文件帮助文档(settings.xml 和 pom.xml)
  • 人脸识别技术应用安全管理规定(试行)
  • FPGA应用学习-----FIFO双口ram解决时钟域+asic样机的时钟选通
  • zabbix案例--zabbix监控Tomcat
  • Electron 应用实现截图并编辑功能
  • 前端= 结构(HTML)+ 样式(CSS)+ 行为(JavaScript)
  • Flink-网络流控及反压剖析
  • redis 和 mongodb 比较
  • Linux 主函数参数介绍
  • 资料分析(三)—— 基期、现期、人口、增长量
  • Java 正则表达式【匹配与分组基本原理】
  • ThreadLocal源码解析
  • RocketMQ 5.1.0 源码详解 | Producer 发送流程
  • 电脑ip地址怎么改 ip地址怎么改到别的城市
  • Android Studio实现列表展示图片
  • 每天一道leetcode:300. 最长递增子序列(动态规划中等)
  • 【无监督】2、MAE | 自监督模型提取的图像特征也很能打!(CVPR2022 Oral)
  • pytorch单机多卡后台运行
  • linux配置上网 linux adsl拨号上网设置
  • XML学习基础知识归纳(一)