加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何最好地分享Akka演员之间的行为?

发布时间:2020-12-16 09:32:52 所属栏目:安全 来源:网络整理
导读:我有两个Akka演员以同样的方式响应一些消息,但是其他方式则以不同的方式。他们都响应同一组消息。想知道如何设计我的两个演员的接收方式,通过继承,镇定等?我尝试将来自其他特征的部分功能与“orElse”进行链接,不幸的是将类暴露给其特征的功能,此外,
我有两个Akka演员以同样的方式响应一些消息,但是其他方式则以不同的方式。他们都响应同一组消息。想知道如何设计我的两个演员的接收方式,通过继承,镇定等?我尝试将来自其他特征的部分功能与“orElse”进行链接,不幸的是将类暴露给其特征的功能,此外,我不知道trait的接收如何容易地访问actor上下文。一个简单的模块化解决方案将是理想的,但我想知道这是否在某个地方解决了问题?

解决方法

真的有很多方法可以解决这个问题。我会从OO方式列出两个(类似于@Randal Schulz的建议)和1个更多功能的方式。对于第一个可能的解决方案,你可以做一些这样简单的事情:

case class MessageA(s:String)
case class MessageB(i:Int)
case class MessageC(d:Double)

trait MyActor extends Actor{

  def receive = {
    case a:MessageA =>
      handleMessageA(a)

    case b:MessageB =>
      handleMessageB(b)

    case c:MessageC =>
      handleMessageC(c)
  }

  def handleMessageA(a:MessageA)

  def handleMessageB(b:MessageB) = {
    //do handling here
  }

  def handleMessageC(c:MessageC)
}

class MyActor1 extends MyActor{
  def handleMessageA(a:MessageA) = {}
  def handleMessageC(c:MessageC) = {}
}

class MyActor2 extends MyActor{
  def handleMessageA(a:MessageA) = {}
  def handleMessageC(c:MessageC) = {}
}

使用这种方法,您基本上定义了一个抽象的actor impl,其中接收函数是为所有处理的消息定义的。这些消息被委派以确定真正的业务逻辑将在哪里。两个是抽象的,让具体的类定义处理,一个完全实现了逻辑不需要的情况。

现在使用策略模式的这种方法的一个变体:

trait MessageHandlingStrategy{
  def handleMessageA(a:MessageA)

  def handleMessageB(b:MessageB) = {
    //do handling here
  }

  def handleMessageC(c:MessageC)
}

class Strategy1 extends MessageHandlingStrategy{
  def handleMessageA(a:MessageA) = {}
  def handleMessageC(c:MessageC) = {}  
}

class Strategy2 extends MessageHandlingStrategy{
  def handleMessageA(a:MessageA) = {}
  def handleMessageC(c:MessageC) = {}  
}

class MyActor(strategy:MessageHandlingStrategy) extends Actor{

  def receive = {
    case a:MessageA => 
      strategy.handleMessageA(a)

    case b:MessageB =>
      strategy.handleMessageB(b)

    case c:MessageC =>
      strategy.handleMessageC(c)
  }
}

这里的方法是在构造过程中传递一个策略类,该类定义了a和c的处理,b再次被处理相同。这两种方法是非常相似的,完成了同样的目标。最后一种方法使用部分功能链接,可能如下所示:

trait MessageAHandling{
  self: Actor =>
  def handleA1:Receive = {
    case a:MessageA => //handle way 1
  }
  def handleA2:Receive = {
    case a:MessageA => //handle way 2
  }  
}

trait MessageBHandling{
  self: Actor =>
  def handleB:Receive = {
    case b:MessageB => //handle b
  }  
}

trait MessageCHandling{
  self: Actor =>
  def handleC1:Receive = {
    case c:MessageC => //handle way 1
  }
  def handleC2:Receive = {
    case c:MessageC => //handle way 2
  }  
}

class MyActor1 extends Actor with MessageAHandling with MessageBHandling with MessageCHandling{
  def receive = handleA1 orElse handleB orElse handleC1
}

class MyActor2 extends Actor with MessageAHandling with MessageBHandling with MessageCHandling{
  def receive = handleA2 orElse handleB orElse handleC2
}

这里,一些特征被设置为定义3种消息类型的消息处理行为。具体的演员混合在这些特质中,然后通过使用部分功能链接来选择他们想要的行为来构建他们的接收功能。

可能还有很多其他方法可以做你想要的,但是我只是想我会给你几个选择。希望它有帮助。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读