组成演员

Bef*_*rem 8 scala actor akka

我已经实现了可以添加到Actors的Listenable/Listener特性.我想知道是否有可能将这种特性附加到一个actor而不必显式调用listenerHandler方法?

我也期待在Akka库中找到这个功能.我错过了什么或是否有某种原因Akka不会包括这个?

trait Listenable { this: Actor =>
    private var listeners: List[Actor] = Nil

    protected def listenerHandler: PartialFunction[Any, Unit] = {
        case AddListener(who) => listeners = who :: listeners
    }

    protected def notifyListeners(event: Any) = {
        listeners.foreach(_.send(event))
    }
}

class SomeActor extends Actor with Listenable
{
    def receive = listenerHandler orElse {
        case Start => notifyListeners(Started())
        case Stop => notifyListeners(Stopped())
    }
}
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 5

为什么不Actor直接扩展,或者如果你想让非Actors也可以监听,那么创建一个可以使用Listenable扩展Actor的ListenableActor?

然后receive你就像在上面做的那样在Actor中重写(除了你super.receive也想要调用,不是吗? - 你只想修改传入的函数).