Akka actor 实现:扩展或注入



我是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!!
    }
}

只有一种类型的参与者并为其注入不同的BehavioHandler实现是否有性能/类加载的好处?我有理由不想这样做并使用"标准"actor实现吗?

如果您只想使用 Actor 作为向处理程序调度消息的一种方式,那么第 2 种(非标准)方式就可以了,并且可以在代码结构方面为您提供一些好处 - 例如,BehaviorHandler 是一个单一方法接口的事实将允许您使用 lambda 实现它。

但是,Actor不仅仅是方法调度程序。它们提供了随着系统复杂性的增加而需要的各种方法。

请参阅 http://doc.akka.io/docs/akka/2.0/java/untyped-actors.html#untypedactor-api

一个典型的,中等大小的Akka系统将需要引用UntypedActor上定义的selfsendercontext

简而言之:如果你不使用继承,那么你放弃的比你意识到的要多。

最新更新