Akka actor 实现:扩展还是注入?
Akka actor implementation: extension or injection?
我是 Akka 的新手(我使用的是 Java lib v2.3.9),我想知道两个竞争参与者实施策略之间的权衡是什么。一方面,我可以用标准方式来实现我的演员:
// Groovy pseudo-code
class StormTrooper extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof ExecuteOrder66) {
// Betray all Jedi, serve the Emperor!
}
}
}
class DarthVader extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Feels) {
// Betray the Emperor, save your son!
}
}
}
class Emperor extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Mace) {
// Transform into your true self!
}
}
}
...不是那样做,我可以通过注入添加一个抽象层:
class StarWarsCharacter extends UntypedActor {
@Inject // Injected behavior; implementation doesn't matter
BehaviorHandler behaviorHadler
@Override
void onReceive(Object message) {
behaviorHandler.handle(message)
}
}
interface BehaviorHandler {
void handle(Object message)
}
class StormTrooperBehaviorHandler implements BehaviorHandler {
@Override
void handle(Object message) {
// Betray all Jedi, serve the Emperor!
}
}
class DarthVaderBehaviorHandler implements BehaviorHandler {
@Override
void handle(Object message) {
// Betray the Emperor, save your son!
}
}
class EmperorBehaviorHandler implements BehaviorHandler {
@Override
void handle(Object message) {
// Transform into your true self!!
}
}
只有一种类型的 actor 并用不同的 BehavioHandler
实现注入它是否有 performance/classloading 好处?为什么我 不想 这样做并使用 "standard" actor 实现?
如果您只想使用您的 Actor 作为向处理程序发送消息的方式,那么第二种(非标准)方式就可以了,并且可以给您带来一些好处在代码结构方面 - 例如BehaviorHandler
是单一方法接口这一事实将允许您使用 lambda 来实现它。
但是,Actor 不是简单的方法调度程序。随着系统复杂性的增加,它们提供了您需要的各种方法。
见http://doc.akka.io/docs/akka/2.0/java/untyped-actors.html#untypedactor-api
典型的中型 Akka 系统需要引用 self
、sender
和 context
,它们在 UntypedActor
.
上定义
简而言之:如果您不使用继承,那么您放弃的比您意识到的要多。
我是 Akka 的新手(我使用的是 Java lib v2.3.9),我想知道两个竞争参与者实施策略之间的权衡是什么。一方面,我可以用标准方式来实现我的演员:
// Groovy pseudo-code
class StormTrooper extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof ExecuteOrder66) {
// Betray all Jedi, serve the Emperor!
}
}
}
class DarthVader extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Feels) {
// Betray the Emperor, save your son!
}
}
}
class Emperor extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Mace) {
// Transform into your true self!
}
}
}
...不是那样做,我可以通过注入添加一个抽象层:
class StarWarsCharacter extends UntypedActor {
@Inject // Injected behavior; implementation doesn't matter
BehaviorHandler behaviorHadler
@Override
void onReceive(Object message) {
behaviorHandler.handle(message)
}
}
interface BehaviorHandler {
void handle(Object message)
}
class StormTrooperBehaviorHandler implements BehaviorHandler {
@Override
void handle(Object message) {
// Betray all Jedi, serve the Emperor!
}
}
class DarthVaderBehaviorHandler implements BehaviorHandler {
@Override
void handle(Object message) {
// Betray the Emperor, save your son!
}
}
class EmperorBehaviorHandler implements BehaviorHandler {
@Override
void handle(Object message) {
// Transform into your true self!!
}
}
只有一种类型的 actor 并用不同的 BehavioHandler
实现注入它是否有 performance/classloading 好处?为什么我 不想 这样做并使用 "standard" actor 实现?
如果您只想使用您的 Actor 作为向处理程序发送消息的方式,那么第二种(非标准)方式就可以了,并且可以给您带来一些好处在代码结构方面 - 例如BehaviorHandler
是单一方法接口这一事实将允许您使用 lambda 来实现它。
但是,Actor 不是简单的方法调度程序。随着系统复杂性的增加,它们提供了您需要的各种方法。
见http://doc.akka.io/docs/akka/2.0/java/untyped-actors.html#untypedactor-api
典型的中型 Akka 系统需要引用 self
、sender
和 context
,它们在 UntypedActor
.
简而言之:如果您不使用继承,那么您放弃的比您意识到的要多。