我已经实现了可以添加到演员的可听/侦听器特征。我想知道是否可以将这种特质风格附加到演员,而无需明确调用 听众Handler 方法?

我也希望在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())
    }
}
有帮助吗?

解决方案

为什么不扩展 Actor 直接,或者,如果您也希望非演员也可以听,请创建一个可听演员的聆听反应器?

然后你会覆盖 receive 在演员中,就像您上面所做的那样(除非您想打电话 super.receive 另外,不是吗? - 您只想修改传递的功能)。

其他提示

我建议您扩展演员并使用 abstract override.

为什么我以前没看过这个问题,嗯,迟到总比没有好:

http://doc.akka.io/docs/akka/snapshot/scala/routing.html

这是一个解决方案(从开始scala中的示例的修改版本):

import se.scalablesolutions.akka.actor.Actor

case class AddListener(who: Actor)
case class RemoveListener(who: Actor)

class ListenableActor extends Actor {
    private var listeners: List[Actor] = Nil

    def receive = {
        case AddListener(who) => listeners ::= who
        case RemoveListener(who) => listeners.filter(_ ne who)
    }

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

class ImplementingActor extends ListenableActor {
    override def receive = {
        super.receive orElse {
            case Message(content) => println(content)
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top