Vue 发布/订阅 与 观察者模式

news/2024/7/10 0:50:05 标签: vue, 前端

现在网上很多文章都讲不清楚什么是发布/订阅和观察者模式,要不就是复制粘贴过来的,百度都能查处一大推一模一样的文章。很气愤!!!

那么我将根据自己的理解去解释发布/订阅和观察者模式,如果有大佬觉得不对,欢迎在评论区留下宝贵意见

发布/订阅模式

发布/订阅模包含:

  • 发布者
  • 订阅者
  • 信号中心

假设你要买房子,但是你有没有房源信息,那么你会找到谁?你肯定会去问房屋中介,那么这个房屋中介就是一个信号中心。那么这个房子的主人也就是房东是一个发布者(publish),你或者其他需要买房的人就是订阅者(subscribe)。

那么在Vue是如何实现的呢?

// Vue 中使用方法
let vm = new Vue()

// 订阅者
vm.$on('change', () => {
    console.log('change')
})

// 订阅者
vm.$on('change', () => {
    console.log('change1')
})

// 发布者
vm.$emit('change')

以上就是 Vue 中使用的方法,通过$on方法来订阅change事件,通过$emit方法来发布change事件,那么订阅者获取到事件之后就会执行相对应的方法。这就是发布/订阅模式(publish-subscribe pattern )。接下来我们老模拟实现一个发布/订阅模式来加深印象

首选我们来分析下订阅/发布模式是如何实现的

  1. 定义一个类Vue(也可以是其他名称)
  2. 类里面有两个方法$on(订阅者)和$emit(发布者)
  3. $on方法里接受两个参数,一个是事件类型,另一个是执行的方法
  4. $emit方法里接受一个参数,事件类型

接下来根据我们分析的情况通过代码来模拟实现如下:

// 事件中心
class Vue {
    constructor () {
        // 创建一个空对象,结构是{ event: [function1, function2, ...] }
        this.subs = Object.create(null)
    }
    
    // 定义$on方法(订阅者)event: 事件名称 handler: 需要执行的方法
    $on (event, handler) {
        // 匹配对应的事件,如果事件存在就取事件对应的值,否则就取空数组
        this.subs[event] = this.subs[event] || []
        
        // 找到对应的事件将值(函数)push到对应的事件值中
        this.subs[event].push(handler)
    }
    
    // 定义$emit方法(发布者)
    $emit(event) {
        // 判断当前事件是否存在,存在执行对应值的方法
        if(this.subs[event]) {
            this.subs[event].forEach(handler => {
                handler()
            })
        }
    }
}

// 测试
let vm = new Vue()
vm.$on('change', () => {
    console.log('change')
})
vm.$emit('change')

浏览器执行以上代码会发现控制台打印出'change',以上就是发布/订阅模式的实现方式

关注我后续我会继续更新观察者模式

 


http://www.niftyadmin.cn/n/1497481.html

相关文章

【bzoj4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+背包dp

题目描述 给出 $n$ 个括号序列&#xff0c;从中选出任意个并将它们按照任意顺序连接起来&#xff0c;求以这种方式得到匹配括号序列的最大长度。 输入 第一行包含一个正整数n(1<n<300)&#xff0c;表示括号序列的个数。接下来n行&#xff0c;每行一个长度在[1,300]之间的…

java 产生随机数_java产生随机数的几种方式

一.在j2se里我们可以使用Math.random()方法来产生一个随机数&#xff0c;这个产生的随机数是0-1之间的一个double&#xff0c;我们可以把他乘以一定的数&#xff0c;比如说乘以100&#xff0c;他就是个100以内的随机&#xff0c;这个在j2me中没有。二.在java.util这个包里面提供…

java基础知识一_java基础知识(一)

一、Java虚拟机JVM (java Virtual Machine)平台无关性 &#xff1a;平台(硬件软件)安全性&#xff1a; 沙箱(放置不可靠java程序)网络移动性: Java Applet(Java 小应用)抽象规范一个具体实现一个运行中的虚拟机实例运行时java虚拟机(JVM)天职&#xff1a;负责运行一个Java程序1…

java分享知识点_Java教程分享Java技术知识点总结

Java教程分享Java技术知识点总结&#xff0c;零基础怎么学Java?下面就一起来看看面试中常见基础Java技术知识点总结。第一&#xff0c;主要是Java环境变量的配置。搭建好环境才能干活。要理解什么是编译、什么是运行。编译是Javac.exe程序在负责;运行则由Java.exe负责。编译后…

怎么让普通用户使用root权限执行用户命令

1、添加用户&#xff0c;首先用adduser命令添加一个普通用户&#xff0c;命令如下&#xff1a; #adduser tommy //添加一个名为tommy的用户#passwd tommy //修改密码Changing password for user tommy.New UNIX password: //在这里输入新密码Retype new UNIX password: //再次输…

java求反码_java原码补码反码关系解析

本文为大家解析了java原码补码反码的关系&#xff0c;供大家参考&#xff0c;具体内容如下原码&#xff1a;不管源数据是十进制还是十六进制&#xff0c;统统将数字转成二进制形式反码&#xff1a;把原码的二进制统统反过来&#xff0c;0变成1&#xff0c;1变成0补码&#xff1…

中文分词-jieba

支持三种分词模式&#xff1a; 精确模式&#xff0c;试图将句子最精确地切开&#xff0c;适合文本分析&#xff1b;全模式&#xff0c;把句子中所有的可以成词的词语都扫描出来, 速度非常快&#xff0c;但是不能解决歧义&#xff1b;搜索引擎模式&#xff0c;在精确模式的基础上…

java的native_Java(Native)

jnijava call c/c implementation apic/c call java/jvm apijnative (便于利用已经存在的native库))java call existing dll/so apijna(便于集成打包发布, best)java call existing dll/so apiswigjava/python call c/c implementation apijavacppjni(JVM javac GCC)1.atom .…