首页 > 其他分享 >JS实现一个发布-订阅模式(观察者模式)

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

时间:2024-07-24 11:58:35浏览次数:15  
标签:function 订阅 观察者 模式 events 事件 监听器 JS event

// 创建一个简单的事件中心,允许对象订阅事件、发布事件并取消订阅。
// 创建一个事件中心对象,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!' })

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

标签:function,订阅,观察者,模式,events,事件,监听器,JS,event
From: https://blog.csdn.net/qq_67996188/article/details/140659358

相关文章

  • 设计模式-原型模式(Prototype)
    设计模式-原型模式(Prototype)  概要   记忆关键词:原型实例、拷贝  定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。    分析:原型模式就是从一个样板对象中复制出一个内部属性一致的对象。它是在内存中拷贝二进制流,比new一个对象的性能好很......
  • “有传统”和王家卫-《分析模式》漫谈13
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集“AnalysisPatterns”的Preface(前言)有这么一句:manydatamodelershave hadalongtradition ofusingconceptual(orlogical)models. 2004(机械工业出版社)中译本的译文为: ......
  • 你能对 Python 类型注释进行模式匹配吗?
    你能在Python类型上进行模式匹配吗?我见过简单的例子:importbuiltinsmatchx:casebuiltins.str:print("matchedstr")casebuildins.int:print("matchedint")但我想在嵌套类型上进行模式匹配,比如Annotated[Optional[Literal["a",......
  • Warning formula.jws.json update failed, falling back to cached version
    Warning:formula.jws.json:updatefailed,fallingbacktocachedversion.MacOS执行服务启动命令时,显示下载失败警告,导致无法启动服务MacBook-Pro~%brewservicesstartnginx==>Downloadinghttps://formulae.brew.sh/api/formula.jws.json########......
  • 216java jsp SSM公司企业人事人力资源管理系统员工考勤休假申请人事变更考核标准结果
     项目技术:SSM+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/1......
  • 214java jsp SSM高校校园食堂订餐点餐系统(源码+文档+运行视频+讲解视频)
     项目技术:SSM+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/1......
  • 213java jsp SSM疫情期间高校师生外出请假管理系统(源码+文档+开题+任务书+运行视频+讲
     项目技术:SSM+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/1......
  • Django 序列化程序无法将查询集序列化为 JSON
    尝试简单的Django序列化器。我使用具有特定值的queryset然后我将queryset或queryset.values()传递给序列化器。为什么会出现500错误?@csrf_protectdefgeoLookup(request,**kwargs):country=kwargs.get('Country')city=kwargs.get('Place'......
  • 使用pip安装时出现JSONDecodeError;点不工作
    Pip在安装软件包时遇到问题,因为每次尝试解析软件包的JSON文件时都会出错。我已尝试以下操作:卸载并重新安装PIP降级PIP版本尝试从可下载的轮子安装软件包确切的错误消息是:ERROR:Exception:Traceback(mostrecentcalllast):File".......
  • 【Python正则表达式】:文本解析与模式匹配
    文章目录1.正则表达式2.re模块3.修饰符3.元字符3-1字符匹配元字符3-2重复次数限定元字符3-3字符集合匹配元字符3-4分组元字符3-5边界匹配元字符3-6字符类别匹配元字符4.技巧4-1贪婪与非贪婪5.案例1.正则表达式正则表达式面向什么样的问题?1、判断一个字......