cmb*_*ter 26
你可以用很多方法来解决这个问题.我将从OO方式列出两个(类似于@Randal Schulz所建议的)和另外一个功能方式.对于第一个可能的解决方案,您可以执行以下简单操作:
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) = {}
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,您基本上定义了一个抽象actor impl,其中receive为所有处理的消息定义了该函数.消息被委托给def真实业务逻辑所在的s.两个是抽象的,让具体类定义处理,一个完全实现逻辑不需要不同的情况.
现在使用策略模式的这种方法的变体:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
这里的方法是在构造期间传递一个策略类,定义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
}
Run Code Online (Sandbox Code Playgroud)
这里设置了一些特征,用于定义3种消息类型的消息处理行为.具体的参与者混合这些特征,然后receive通过使用部分功能链来构建他们想要的行为.
可能有很多其他方法可以做你想要的,但我只是觉得我会为你提供一些选择.希望能帮助到你.
到目前为止,我没有理由后悔将我的服务的实际功能(所谓的"业务逻辑")推送到较低层,"常规"和同步(有时是阻塞)库,可以进行单元测试没有演员的复杂性.我在Actor类中唯一放置的是传统库代码所处的共享的长期可变状态.当然,这和Akka Actor receive函数的消息解码和调度逻辑有关.
如果你这样做,以你寻求的方式分享逻辑是微不足道的.
| 归档时间: |
|
| 查看次数: |
4960 次 |
| 最近记录: |