代码事件派发机制(观察者模式)
事件派发机制主要用来解决:
代码解耦和维护,一般在代码中会要管理一些闭包函数 然后在指定的业务中触发运行闭包函数逻辑用了事件派发机制 就可以先把要处理的事件 挂在在一个事件管理类中 上面挂满要处理的闭包函数然后通过dispatch 出发要执行的任务 也就是闭包
1. PHP中实现
在 PHP 中,你可以使用事件派发机制来实现基于观察者模式的事件驱动开发。下面是一个简单的示例来展示如何实现事件派发机制:
<?phpclass EventDispatcher
{private $listeners = [];public function addListener($eventName, $listener){$this->listeners[$eventName][] = $listener;}public function dispatch($eventName, $data = null){if (isset($this->listeners[$eventName])) {foreach ($this->listeners[$eventName] as $listener) {call_user_func($listener, $data);}}}
}// 示例使用
$dispatcher = new EventDispatcher();// 添加事件监听器
$dispatcher->addListener('user.registered', function ($data) {echo "用户注册成功:{$data}\n";
});$dispatcher->addListener('user.loggedIn', function ($data) {echo "用户登录成功:{$data}\n";
});// 模拟触发事件
$dispatcher->dispatch('user.registered', 'user123');
$dispatcher->dispatch('user.loggedIn', 'user456');
在上面的示例中,我们创建了一个名为 EventDispatcher 的事件调度器类。该类包括 addListener() 方法用于添加事件监听器,和 dispatch() 方法用于触发事件并通知相应的监听器。
通过调用 addListener() 方法,我们可以为特定的事件名称注册一个或多个监听器。这些监听器是以匿名函数的方式定义的,用于处理事件被触发时的逻辑。
在 dispatch() 方法中,我们检查指定事件名称的监听器列表是否存在,然后依次调用每个监听器函数,并将事件数据作为参数传递给它们。
最后,在示例的最后部分,我们通过调用 dispatch() 方法模拟触发了两个事件,然后相应的监听器函数被调用并处理事件。
运行以上代码,将会输出如下信息:
用户注册成功:user123
用户登录成功:user456
这样就实现了一个简单的事件派发机制。在实际的应用中,你可以根据需要扩展和定制事件调度器,添加更多的事件和监听器,以实现更复杂的业务逻辑。
2 go语言中实现
在 Go 语言中,你可以使用通道(channel)和协程(goroutine)的特性来实现一个简单的事件派发机制。下面是一个示例代码:
package mainimport ("fmt""time"
)type Event struct {Name stringData interface{}
}type EventDispatcher struct {listeners map[string][]chan interface{}
}func NewEventDispatcher() *EventDispatcher {return &EventDispatcher{listeners: make(map[string][]chan interface{}),}
}func (ed *EventDispatcher) AddListener(eventName string, listener chan interface{}) {if _, ok := ed.listeners[eventName]; !ok {ed.listeners[eventName] = make([]chan interface{}, 0)}ed.listeners[eventName] = append(ed.listeners[eventName], listener)
}func (ed *EventDispatcher) Dispatch(eventName string, data interface{}) {if listeners, ok := ed.listeners[eventName]; ok {event := Event{Name: eventName,Data: data,}for _, listener := range listeners {go func(ch chan interface{}) {ch <- event}(listener)}}
}func main() {dispatcher := NewEventDispatcher()// 添加事件监听器listener1 := make(chan interface{})dispatcher.AddListener("event1", listener1)listener2 := make(chan interface{})dispatcher.AddListener("event2", listener2)// 模拟触发事件dispatcher.Dispatch("event1", "data1")dispatcher.Dispatch("event2", "data2")// 读取监听器收到的事件go func(ch chan interface{}) {for {event := <-chfmt.Println(event)}}(listener1)go func(ch chan interface{}) {for {event := <-chfmt.Println(event)}}(listener2)// 等待事件处理time.Sleep(time.Second)
}
在上述示例中,我们定义了 Event 结构体来表示事件,其中包含事件名称和事件数据。EventDispatcher 结构体用于管理事件监听器和事件派发。通过 AddListener 方法可以为指定事件名称注册一个事件监听器,而 Dispatch 方法用于派发事件并通知相应的监听器。
在 main 函数中,我们实例化了一个 EventDispatcher 对象,并添加了两个事件监听器,分别监听名为 “event1” 和 “event2” 的事件。
然后,我们使用 Dispatch 方法模拟触发了 “event1” 和 “event2” 事件,并将相关数据传递给监听器。
最后,我们在两个协程中创建了监听器函数,用于处理收到的事件。通过使用通道读取操作 <-ch,监听器函数可以不断等待事件的到来。
运行以上代码,将会得到类似如下的输出:
{event1 data1}
{event2 data2}
这样就实现了一个简单的事件派发机制。你可以根据需要扩展该事件派发器,增加更多事件和监听器,以满足具体的业务需求。同时需要注意,对于涉及并发的操作,需要进行适当的同步和错误处理。
相关文章:
代码事件派发机制(观察者模式)
事件派发机制主要用来解决: 代码解耦和维护,一般在代码中会要管理一些闭包函数 然后在指定的业务中触发运行闭包函数逻辑用了事件派发机制 就可以先把要处理的事件 挂在在一个事件管理类中 上面挂满要处理的闭包函数然后通过dispatch 出发要执行的任务 也就是闭包1. PHP中实…...
微服务技术栈-Nacos配置管理和Feign远程调用
文章目录 前言一、统一配置管理1.添加配置文件2.微服务拉取配置3.配置共享 三、Feign远程调用总结 前言 在上篇文章中介绍了微服务技术栈中Nacos这个组件的概念,Nacos除了可以做注册中心,同样可以做配置管理来使用。同时我们将学习一种新的远程调用方式…...
操作系统 OS
本文章是学习《操作系统》慕课版 和 王道《2024年 操作系统 考研复习指导》后所做的笔记,其中一些图片来源于学习资料。 目录 概念(定义) 目标 方便性 有效性 可扩充性 开放性 作用 OS 作为用户与计算机硬件系统之间的接口 — 人机交…...
基于ffmpeg给视频添加时间字幕
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,我们可以基于ffmpeg对视频进行各种操作。本文主要介绍基于ffmpeg给视频添加字幕,字幕的内容为视频所播放的时间(故需要安装ffmpeg,具…...
爬虫基础知识点快速入门
以下是一个包含注释的Python示例,演示了基本的网页爬取过程,以及一些常见的爬虫知识点: # 导入必要的库 import requests # 用于发送HTTP请求 from bs4 import BeautifulSoup # 用于解析HTML import csv # 用于数据存储# 1. 指定目标网站…...
解释器模式 行为型模式之五
1.定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器。比如加减乘除在代码里是一种表示,我们需要翻译成可以阅读的数学公式,并且可以供用户输入数字得到输出结果。 2.组成结构 抽象表达式(Abstract Expres…...
2023年中国汽车座舱行业发展现状及趋势分析:高级人机交互(HMI)系统将逐步提升[图]
2022年有22.3%的汽车用户认为座舱内车载娱乐功能成为影响使用体验的关键因素。当前智能电动汽车的用户画像与娱乐、游戏等应用的用户画像相似,均以年轻人作为目标用户。年轻化的用户将娱乐功能的使用习惯延伸至汽车座舱内,对于座舱功能的需求不再局限于导…...
常见的通用型项目管理软件推荐
常用项目管理软件有很多。按适合的行业来分,有针对各种垂直行业定制的,也有全行业通用的。从厂商来看,有国外研发的,也有国内厂商的,体现在软件的设计思路不同,上手的手感也很不一样。从体量来看࿰…...
手机总是提醒系统更新,到底要不要更新呢?
不知道你们会不会和我一样,在收到手机系统更新的通知时,犹豫要不要更新? 更新完了手机会变卡顿吗? 每次都要更新吗?怎样才能关闭它呢? 01 手机系统更新啥内容? 手机系统更新可以分为大版本更新和小版本更新。 (1) 大版本更新 如iOS15升…...
什么是API
API (Application Programming Interface,应用程序编程接口) Java中的API 指的就是 JDK 中提供的各种功能的 Java类,这些类将底层封装起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档…...
RedissonClient 分布式锁 处理并发访问共享资源
1.分布式锁的概念及需求 分布式锁是一种在多个进程或线程之间同步访问共享资源的机制。在分布式系统中,由于各个节点之间的通信延迟以及资源访问的竞争,可能导致数据不一致和并发问题。为了解决这些问题,我们需要一种能够在不同节点上保证同…...
Hadoop-2.5.2平台环境搭建遇到的问题
文章目录 一、集群环境二、MySQL2.1 MySQL初始化失败2.2 MySQL启动报错2.3 启动时报不能打开日志错2.4 mysql启动时pid报错 二、Hive2.1 mr shuffle不存在2.1.2 查看yarn任务:2.1.3 问题描述:2.1.4 参考文档 一、集群环境 java-1.8.0-openjdk-1.8.0.181…...
基于WTMM算法的图像多重分形谱计算matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、WTMM算法概述 4.2、WTMM算法原理 4.2.1 二维小波变换 4.2.2 模极大值检测 4.2.3 多重分形谱计算 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部…...
VR全景展示带来旅游新体验,助力旅游业发展!
引言: VR(虚拟现实)技术正以惊人的速度改变着各行各业,在旅游业中,VR全景展示也展现了其惊人的影响力,为景区带来了全新的宣传机会和游客体验。 一.什么是VR全景展示? VR全景展示是…...
Xcode 15 编译出错问题解决
正常升级xcode 15以后发现原来没有出现报错的代码,现在出现了编译错误。(如果没有出现请忽略)下面教你如何解决这个问题。 1、pod update更新cocoapods,因为其根据xcode15做了很多的更新,保证cocoapods是最新的。 千…...
基于指数趋近律的机器人滑模轨迹跟踪控制算法及MATLAB仿真
机械手是工业制造领域中应用最广泛的自动化机械设备,广泛应用于工业制造、医疗、军工、半导体制造、太空探索等领域。它们虽然形式不同,但都有一个共同的特点,即能够接受指令,并能准确定位到三维(或二维)空间的某一点进行工作。由…...
华为云API自然语言处理的魅力—AI情感分析、文本分析
云服务、API、SDK,调试,查看,我都行 阅读短文您可以学习到:人工智能AI自言语言的情感分析、文本分词、文本翻译 1 IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&a…...
微擎小程序获取不到头像和昵称解决方案
这是一个使用微擎小程序的代码示例,其中包含了获取用户头像和昵称的功能。以下是解决方案: 首先,在<button>标签上添加open-type"chooseAvatar"属性,并绑定bindchooseavatar事件: <button class&qu…...
Qt 对界面类重命名的步骤
有些时候因为一些原因,需要修改Qt中创建的界面类,修改的地方比较多,一定要留意有没有修改完全,否则会出现各种奇怪报错。 比如,将MainWindow界面类名修改为lb_logdisplay 修改步骤: 修改文件名:…...
使用docker搭建nacos单机、集群 + mysql
单机搭建 1 拉取mysql镜像 docker pull mysql:5.7.40 2 启动mysql容器 docker run -d --namemysql-server -p 3306:3306 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.7.40 3 执行nacos的数据库脚本 /* * Copyright 1999-2018 Alibaba Group Holding L…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
