惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News | PayPal Newsroom
IT之家
IT之家
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
大猫的无限游戏
大猫的无限游戏
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LangChain Blog
S
SegmentFault 最新的问题
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Project Zero
Project Zero
P
Privacy & Cybersecurity Law Blog
V
Vulnerabilities – Threatpost
博客园 - 三生石上(FineUI控件)
Recorded Future
Recorded Future
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
宝玉的分享
宝玉的分享
aimingoo的专栏
aimingoo的专栏
T
Tor Project blog
T
The Exploit Database - CXSecurity.com
Schneier on Security
Schneier on Security
H
Help Net Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
M
MIT News - Artificial intelligence
W
WeLiveSecurity
P
Proofpoint News Feed
A
About on SuperTechFans
S
Securelist
I
InfoQ
G
Google Developers Blog
博客园 - 司徒正美
博客园 - 叶小钗
Latest news
Latest news
F
Fortinet All Blogs
G
GRAHAM CLULEY
腾讯CDC
Jina AI
Jina AI
S
Schneier on Security
I
Intezer
V
Visual Studio Blog
美团技术团队
V2EX - 技术
V2EX - 技术
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
罗磊的独立博客
Y
Y Combinator Blog

博客园 - 编写人生

关于数据隔离 Pool 模型 的补充 数据流动、隔离粒度与一致性 大型 ERP 云架构的隔离与协作 企业级 Agent 架构的真实形态:Skill、A2A 与 MCP 的边界思考 如何更优雅地提供 MCP Resources 面向 AI Agent 的能力模型与多协议生成架构设计思考 从 LangGraph 回到 Model-Tool Loop:更聪明的模型,正在让 Agent 架构重新变简单 Agent 的“上下文” 生命周期的思考 .NET GC设计的新想法 AI OS 海量 MCP 工具场景下的上下文隔离选择方案 Python 异步编程完全指南 软件架构设计模式全览 我花了一上午,帮一个 AI 找到了自己的"亲生父母" Agent构建:声明式优于硬编码 探索 Nim 中的 sequtils 与箭头语法 —— 立即计算与惰性计算的那些事 .NET Exception.Data 属性:上下文错误处理的架构深思 组合优于继承最佳实践指南 UI界面设计:继承 vs 组合 的架构思考 Nim 枚举类型 对性能的影响 Nim 概念 Concept 对性能的影响 C# 泛型编译特性对性能的影响 在AI大爆发的背景下,企业管理软件有什么冲击 c#使用内存映射像处理内存一样去快速处理文件 关于.net 和 JAVA 在内存处理(GC)设计上的差距(ChatGPT水文) 我与 ChatGPT 讨论了面向对象语言 中,关于动态调用的问题 寓言故事:超喜欢的玩具 关于 智能红绿灯 的简单探索 Nim 语言新的性能测试
Kotlin 实现类似 C# 的 Event 事件代码
编写人生 · 2021-01-28 · via 博客园 - 编写人生

在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){

    }
}