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