5

对于普通演员来说,他们可以组成。但是,我似乎找不到任何关于使用 FSM 进行操作的信息。并且没有使用 += 来添加内容的接收块。有没有人有任何尝试概括 FSM 的经验?

我无法提供代码示例,因为我还没有任何代码,因为我不知道我是否可以编写 FSM。

4

1 回答 1

2

您可以使用部分函数来组合状态行为,方法与组合 Actor 部分函数的方式相同。该when()函数需要 ) 类型的部分函数scala.PartialFunction[FSM.this.Event, FSM.this.State]。在下面的示例中,我Jibber使用在 trait 中声明的部分函数(例如一些常见行为)扩展状态。您可以使用完全相同的技术,onTermination使用声明为 的 PF 从 trait 扩展行为scala.PartialFunction[StopEvent, Unit]

我使用这种技术从一些复杂的 FSM 中提升了重要的常见行为。

package monster

import akka.actor._
import monster.FlyingSpaghetti._

// State and data objects
object FlyingSpaghetti {

  trait State

  object Jibber extends State
  object Jabber extends State

  object Ping
  object Done

}

// Trait with common behaviour behaviour
trait FlyingSpaghetti  extends Actor with FSM[State,String]{
  val layer: StateFunction = {
    case Event(Done,s) ⇒
      println("Done behaviour layered")
      stop()
  }
}

class Monster() extends FlyingSpaghetti {

  startWith(Jibber,"jabber")
  self ! Ping
  println("Starting")

  // First, do the common behaviour PF then do specialised behaviour
  when(Jibber) (layer orElse {
    case Event(Ping,"jabber") ⇒
      println("jabber")
      goto(Jabber) using "jibber"
    case Event(Done,s) ⇒
      println("Done jabbering")
      stop()
  })

  when(Jabber) {
    case Event(Ping,"jibber") ⇒
      println("jibber")
      goto(Jibber) using "jabber"
    case Event(Done,s) ⇒
      println("Done jibbering")
      stop()
  }
}

object Run extends App {
  val system = ActorSystem("mySystem")
  val rattle = system.actorOf(Props[Monster])
  rattle ! Ping
  rattle ! Ping
  rattle ! Done
  Thread.sleep(100)
  system.shutdown()
}
于 2015-03-16T12:17:40.907 回答