Kotlin 实现类似 C# 的 Event 事件代码
在c#中,内置了对事件的设计模式,你可以简单的 += 来订阅一个事件。
Kotlin 目前我没有发现内置的支持(如果你发现了,请留言告诉我 tansm),但Kotlin 非常方便的运算符重载,自己实现也非常简单。
internal typealias EventHandle<T> = (Any,T) -> Unit //sender, args
internal class EventHandleList<T>{
private val _observers = mutableListOf<EventHandle<T>>()
operator fun plusAssign(observer : EventHandle<T>){
_observers.add(observer)
}
operator fun minusAssign(observer: EventHandle<T>){
_observers.remove(observer)
}
operator fun invoke(sender : Any,args : T){
for(observer in _observers){
observer(sender,args)
}
}
}
要使用这个定义,也非常容易。下面的代码我们假装 RedoReceiver 是事件的发布者,ReplicationManager 是事件的订阅者。
internal class RedoReceiver{
val signalArrivalEvents = EventHandleList<SignalArrivalEventArgs>()
fun daoDa(){
val signal = SignalType.CONTROL_CONNECT
signalArrivalEvents(this, SignalArrivalEventArgs(signal))
}
}
internal class SignalArrivalEventArgs(
val SignalType : SignalType
)
internal class ReplicationManager{
private val _r = RedoReceiver()
init {
_r.signalArrivalEvents += this::onSignalArraival
}
private fun onSignalArraival(sender : Any, e : SignalArrivalEventArgs){
}
}
Kotlin 实现类似 C# 的 Event 事件代码的更多相关文章
- 11月21日内容总结——多进程实现TCP服务端并发、互斥锁、线程及代码实现、GIL全局解释器锁、信号量、event事件、进程池和线程池、协程
目录 一.多进程实现TCP服务端并发 二.互斥锁代码实操 1.互斥锁的概念 2.互斥锁的使用 3.死锁现象 4. 小结 三.线程理论 进程 线程 线程简介 为什么要使用多线程? 多线程概念 多进程的优 ...
- CDI(Weld)高级<4> Event(事件) (转)
目录[-] 1. Event payload(事件的有效载入) 2. Event observers(event的观察者) 3. Event producers(event生产者) 4.Annotat ...
- 委托与事件代码详解与(Object sender,EventArgs e)详解
委托与事件代码详解 using System;using System.Collections.Generic;using System.Text; namespace @Delegate //自定义 ...
- mysql定时任务(event事件)
1.event事件 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器” 事件和触发器类似,都 ...
- JavaScript 运行机制:Event事件循环机制
JavaScript Event事件循环机制 JS是单线程的,浏览器只分配一个主线程给JS.一次只能执行一个任务,当前任务执行完后在可以执行下一个任务.任务多时,就会形成任务队列排队等待执行.但是非常 ...
- python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03
目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...
- 互斥锁 线程理论 GIL全局解释器锁 死锁现象 信号量 event事件 进程池与线程池 协程实现并发
目录 互斥锁 multiprocessing Lock类 锁的种类 线程理论 进程和线程对比 开线程的两种方式(类似进程) 方式1 使用Thread()创建线程对象 方式2 重写Thread类run方 ...
- [.NET] C# 知识回顾 - Event 事件
C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...
- WPF自定义RoutedEvent事件代码段
今天在写东西的时候,发现常用的代码段里没有RoutedEvent的,因此,写了一个代码段,方便以后使用,顺便记录一下,如何做代码段. 1.在项目中新建一个XML文件,将扩展名修改为snippet. 2 ...
- trigger()的event事件对象之坑
问题引入,先贴一段有问题的代码,如果你对 trigger() 这个函数了解不透彻,还真看不出这段代码错在哪.完成的功能是样式转换器,想让页面在加载后自行触发点击事件隐藏三个按钮,但是效果如图并没有隐 ...
随机推荐
- Flink流处理-简单案例-01
一.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- 2024年! kali高级配置加一键教程加前人的经验加后人的实践
2024年! kali高级配置加一键教程加前人的经验加后人的实践 记录一下配置kali的过程,方便下次需要直接复制粘贴 直接终端按照顺序输入就可以配置好 作者已踩点,请放心 kali更换国内源 sud ...
- github上文件过大无法推送问题
GitHub 对文件大小有限制,超过 100 MB 的文件无法直接推送到仓库中. 解决思路: 使用 Git Large File Storage (Git LFS) 来管理大文件 不上传对应的大文件 ...
- go实现设计模式(1)——简介
六大原则 开闭原则(Open Close Principle) 对扩展开放,对修改关闭.对程序进行拓展时,尽量不去修改原有的代码,应该通过扩展实体的行为来实现. 里氏替换原则(Liskov Subst ...
- ESP32-S3-WROOM-1-N16R8
ESP32-S3-WROOM-1-N16R8 基于立创实战派S3 参考链接:实战派开发板S3介绍 | 立创开发板技术文档中心 硬件和代码,(大部分图片)基于立创文档,在此基础上进行个人的学习记录和理解 ...
- Flink学习(十五) 滑动事件时间窗口加上水位线开始窗口时间如何确定?(底层源码)
先看上一节的代码程序 package com.wyh.windowsApi import org.apache.flink.streaming.api.TimeCharacteristic impor ...
- Week09_day05(Hbase的基本使用)
使用HBase 和 Hbase使用帮助 1).进入HBase #使用命令进入HBase Shell $ hbase shell The HBase shell is the (J)Ruby IRB ...
- 面试题 17.12. BiNode
地址:https://leetcode-cn.com/problems/binode-lcci/ <?php /** 二叉树数据结构TreeNode可用来表示单向链表(其中left置空,righ ...
- Web前端入门第3问:前端需要学习哪些技术?
Web前端开发技术学习路径 基础知识 必备 HTML+CSS+JavaScript ,就目前来看,这三板斧是入门前端开发的门槛,无论如何都是逃不掉了. 进阶知识 必须会一门主流的前端框架,比如:Rea ...
- vue2打包部署到nginx,解决路由history模式下页面空白问题
项目使用的是vue2,脚手架vue-cli 4. 需求:之前项目路由使用的是hash,现在要求调整为history模式,但是整个过程非常坎坷,遇到了页面空白问题.现在就具体讲一下这个问题. 首先,直接 ...