我有一些具有共同行为的 Akka 演员。这种常见行为在 trait 中定义:
trait CommonBehavior {
this: Actor =>
var history: List[String] = Nil
protected def commonActions: Receive = {
case Action1 => history = "action1" :: history.take(99)
case Action2 => history = "action2" :: history.take(99)
case GetHistory => sender() ! history
}
}
Actor 覆盖了这个 trait 并定义了额外的行为orElse
。这是这种演员的一个例子:
class MyActor extends Actor with CommonBehavior {
var state: Int = 0
override def receive: Receive =
commonActions orElse {
case Increment => state += 1
case Decrement => state -= 1
}
}
我知道改变状态是一种反模式,我想使用context.become
. 问题是,当用 更改状态时MyActor
,context.become
我不知道 commonActions 的参数。甚至可以继承行为吗?我是否需要更大的重构(例如创建代理演员)?这是我已经走了多远:
trait CommonBehavior {
this: Actor =>
protected def commonActions(history: List[String]): Receive = {
case Action1 => context.become(??? orElse commonActions("action1" :: history.take(99))
case Action2 => context.become(??? orElse commonActions("action2" :: history.take(99))
case GetHistory => sender() ! history
}
}
class MyActor extends Actor with CommonBehavior {
override def receive = ready(0)
def ready(state: Int): Receive = {
case Increment => context.become(ready(state + 1) orElse commonActions(???))
case Decrement => context.become(ready(state - 1) orElse commonActions(???))
} orElse commonActions(Nil)
}