GO语言仿事件系统

news/2025/3/13 4:05:14/

话说这是一个风和日丽的上午,拿到了外卖小哥送来的我最心爱的麻辣烫,我打开了因为昨天刚充了三毛钱电费而恢复了使用的电脑,登上了满是美女好友的微信,熟悉的声音马上响彻在了我这三百平米的卧室中,果然我的魅力无法让人自拔,点开这闪烁的美女头像,一行文字映入眼帘,还钱,月底还不还钱把你麻辣烫到了…… 真好
话说最近各地都开始下雪了,都降温了,是真冷啊

在这里插入图片描述跑题了……废话不多说,上货在这里插入图片描述

事件系统原理

事件系统可以分为两部分,事件的发生部分和处理部分,就像某个明星发生了丑闻,就会有公关,法务等等部门马上响应并处理。
一个事件系统拥有如下特性:
1.能够实现事件的一方,可以根据事件 ID 或名字注册对应的事件。
2.事件发起者,会根据注册信息通知这些注册者。
3.一个事件可以有多个实现方响应。

在这里插入图片描述

事件注册实现

事件的发生就会通知对应的处理方,所以我们需要将事件与处理方连接起来,所以我们需要通过注册的方式将事件与处理方连接起来

//创建一个全局事件集,用map切片储存,时间名为key,处理方法为value
var nameOfEvent = make(map[string][]func(interface{}))// 注册事件,提供事件名和回调函数
func RegisterEvent(name string, callback func(interface{})) {// 通过名字查找事件列表list := nameOfEvent[name]// 在列表切片中添加函数list = append(list, callback)// 将修改的事件列表切片保存回去nameOfEvent[name] = list
}

1.首先创建一个全局事件集,用map切片储存,时间名为key,处理方法为value
2.注册事件,事件名和回调函数(处理方法)作为参数
因为一个事件可以有多个处理方,所以采用数组储存不同处理方

事件调用实现

// 调用事件
func CallEvent(name string, param interface{}) {// 通过名字找到事件列表list := nameOfEvent[name]// 遍历这个事件的所有回调for _, callback := range list {// 传入参数调用回调callback(param)}
}

1.通过时间名获取处理方
2.遍历处理方,将每个函数回调传入事件参数并调用,就会触发事件实现方的逻辑处理。

处理方实现

// 声明机构的结构体
type Actor struct {Aname string Bname string 
}
// 为机构添加一个事件处理函数
func (actor *Actor) OnEvent(param interface{}) {fmt.Println(actor.Aname,param)
}
// 为机构添加另一个事件处理函数
func (actor *Actor) GlobalEvent(param interface{}) {fmt.Println(actor.Bname, param)
}// 为第三方机构添加另一个事件处理函数
func ThreeOnEvent(param interface{}) {fmt.Println("第三方", param)
}

1.首先声明机构和第三方,代表多个处理方
2.实现对应处理方法

事件触发

func main() {// 实例化机构actor := Actor{"法务","公关",}// 注册名为OnSkill的法务回调RegisterEvent("xxx出轨了", actor.OnEvent)// 注册名为OnSkill的公关回调RegisterEvent("xxx出轨了", actor.GlobalEvent)// 再次在OnSkill上注册第三方事件RegisterEvent("xxx出轨了", ThreeOnEvent)// 调用事件,所有注册的同名函数都会被调用CallEvent("xxx出轨了", "开始行动")
}

在这里插入图片描述

  1. 实例化机构,并为机构中各部门署名
    2.注册事件
    3.自动处理

你以为结束了

结果演示,角色和全局的事件会按注册顺序顺序地触发。

一般来说,事件系统不保证同一个事件实现方多个函数列表中的调用顺序,事件系统认为所有实现函数都是平等的。也就是说,无论例子中的 a.OnEvent 先注册,还是 GlobalEvent() 函数先注册,最终谁先被调用,都是无所谓的,开发者不应该去关注和要求保证调用的顺序。

一个完善的事件系统还会提供移除单个和所有事件的方法。
在这里插入图片描述
大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划!
在这里插入图片描述


http://www.ppmy.cn/news/581727.html

相关文章

PTN/IPRAN技术介绍及发展史

目录 一、IP RAN(IP Radio Access Network) 二、PTN与IPRAN技术的比较 三、IP RAN发展史: 四、为什麽使用PTN 一、IP RAN(IP Radio Access Network) IPRAN 简单的说是指IP化的移动回传 是运营商的接入技术&#x…

产品经理进修第四天 产品增长怎么做

19 | 增长黑客的核心公式 作为即将开始的产品增长系列的第一篇文章,这篇文章的主旨是如何利用增长黑客实现产品的增长。 “增长黑客”这个词最近特别火,这个概念最初是由互联网创业者肖恩 埃利斯(Sean Ellis)提出的&#xff0c…

养生秘方,专治各种小毛病,千万别弄丢了!

1、洋葱疗法 洋葱本身还有杀毒作用,在晚上睡觉的时候,将洋葱放在袜子里面的话,可以减轻感冒,发烧等症状,可以帮助身体恢复健康、1、首先,切一片洋葱;2、然后把洋葱放到脚底的位置;3、…

Facebook内战:关于欲望、天才和背叛的故事

Facebook是全球第一大社交网站。建站之初,几位年轻的创始人曾彼此承诺要同甘共苦,有福同享,但是随着网站的壮大,金钱、名气和美女纷至沓来,他们开始四分五裂,演出一场名利场悲喜剧。美国双日出版社7月14日出…

数据源大盘点 | 你们要的数据源都在这儿了84个!(保持更新,建议收藏)

作为一名数据分析师,我们是否经常遇到找不到可靠、质量高的数据来源的难题?今天我为大家收集汇总互联网上各类公开数据源,以后就不用到别处找了,赶紧收藏下来吧!! 城市交通 1、高德交通 report.amap.com/i…

曼昆 宏观经济学 笔记

曼昆宏观经济学目录 第一章 导言1.1 宏观经济学家研究什么1.2 宏观经济学家是如何思考的内生变量与外生变量假设多个模型的使用价格 黏性与弹性 长期与短期微观模型与宏观模型 一个小故事 第二章 宏观经济学的数据(以后再看)2.1 国内生产总值投资政府购买…

前端二(HTML、CSS)

前端系列文章目录 第一部分:前端一,前端二—— HTML与CSS 第二部分:前端三,前端四—— JavaScript 第三部分:前端五—— Node.js 第四部分:前端六—— Vue 第五部分:前端七—— React CSS目录 …

新时代的大跃进

前些日子去了趟北京,特意走了走创业大街,当年的书店几乎都看不见了,只有各种创业咖啡,创投风投,各种路演的广告和牌子,各种创业导师的视频回放,总觉得这种地方创业能成事才怪。 和一些新老朋友聊…