我见过的所有演员系统实现(主要使用Akka)都假定一个Web应用程序,这意味着一个非常自然地由异步actor系统提供服务的HTTP接口。
但是,如果我正在编写桌面应用程序,或者将库用作独立于平台的应用程序的组件,该怎么办?
我希望客户端子程序能够调用val childObj = parentObject.createChild( initParam )
而无需了解我允许的消息类型或一般的actor系统。例如,不是parentObject ! CreateChild( initParam )
,然后处理在另一条消息中收到的响应。
我知道我可以隐藏Futures背后的异步响应,但同步系统还有其他已知的模式将计算交给隐藏的actor系统吗?
(我意识到这会导致对库的阻塞调用。)
答案 0 :(得分:0)
许多适用于图书馆的内容也适用于此,请查看以下部分。如果不出意外,您可以将使用Akka作为单独库的代码部分包装起来。需要注意的是,如果您正在使用Swing,您可能希望在与GUI交互之前使用SwingUtilities.invokeLater
来重新启动Event Dispatch Thread。 (另外,不要阻止该线程。您可能希望使用期货来避免这种情况,因此请考虑设计您的库以返回期货。)
您的示例似乎假设一个瘦的包装器围绕您的演员,或者至少是一个自下而上的设计,您的界面由您的实现细节驱动。相反,以更自上而下的方式设计库,首先找出库的接口,然后(可能)使用Akka作为实现细节。 (对于一般的图书馆设计来说这是一个好主意。)如果您已经使用Akka编写了一些内容,请不要担心,只需将接口与实现分开设计并将两者拼接在一起即可。如果你这样做,你就不需要特定的模式,因为无论你使用Akka的事实如何,接口设计的正常模式都适用。
作为示例,请考虑编译器。编译方法签名可能很简单:
def compile(sources: List[File]): List[File] // Returns a list of binaries
这里没有提到演员。但这可能会:
compileActor ? Compile(sources)
...并阻止结果。主编译器actor可能依赖于其他actor,但没有理由通过公共API公开它们。