JS实现一个发布-订阅模式(观察者模式)

// 创建一个简单的事件中心,允许对象订阅事件、发布事件并取消订阅。
// 创建一个事件中心对象,IIFE,返回一个包含订阅、取消订阅和发布方法的对象
const EventCenter = (function () {
    // 存储事件及其对应的订阅者,存储事件及其对应的监听器数组
    const events = {}

    return {
        // 订阅事件,将监听器函数添加到事件数组中
        subscribe: function (event, listener) {
            // 如果事件不存在,则创建一个新的数组
            if (!events[event]) {
                events[event] = []
            }
            // 若事件存在 ,则将监听器函数添加到事件数组中
            events[event].push(listener)
        },
        // 取消订阅事件
        unsubscribe: function (event, listener) {
            // 如果事件不存在,则直接返回
            if (!events[event]) {
                return
            }
            // 如果事件存在,则找到对应的监听器并移除
            events[event] = events[event].filter(fn => fn !== listener)
        },
        // 发布事件,执行事件数组中的所有监听器函数
        publish: function (event, data) {
            // 如果事件不存在,则直接返回
            if (!events[event]) {
                return
            }
            // 如果事件存在,则遍历事件数组并执行所有监听器函数
            events[event].forEach(listener => listener(data))
        }
    }
})()

// 用法
// 声明第一次事件
function eventListener1(data) {
    console.log('事件1被触发,接收到的数据是:', data);
}
// 订阅第一次事件
EventCenter.subscribe('event1', eventListener1)
// 声明第二次事件
function eventListener2(data) {
    console.log('事件2被触发,接收到的数据是:', data);
}
// 订阅第二次事件,但都放在event1中
EventCenter.subscribe('event1', eventListener2)
// 发布事件,结果是两个事件都被触发
EventCenter.publish('event1', { message: 'Hello, subscribers!' })
// 取消订阅事件
EventCenter.unsubscribe('event1', eventListener1)
// 再次发布事件,结果是只有事件二被触发
EventCenter.publish('event1', { message: 'Hello, subscribers!' })

订阅者-发布者原理让我们更好的理解软件架构设计模式,事件的注入 ,是一个很好的关注点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼鱼不让我编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值