是否有编写隐藏其参与者系统实现的库的模式?

Are there patterns for writing a library that hides its actor system implementation?

我见过的所有演员系统实现(主要使用 Akka)都假定一个 Web 应用程序,这意味着一个 HTTP 接口可以很自然地由异步演员系统提供服务。

但是,如果我正在编写桌面应用程序或用作独立于平台的应用程序的组件的库怎么办?

我希望客户端子例程能够调用 val childObj = parentObject.createChild( initParam ) 而无需了解我允许的消息类型或一般的 actor 系统。例如,Not parentObject ! CreateChild( initParam ),然后处理在另一条消息中收到的响应。

我知道我可以隐藏 Futures 背后的异步响应,但是同步系统是否有其他已知模式将计算移交给隐藏的 actor 系统?

(我意识到这会导致对库的阻塞调用。)

桌面应用

很多适用于图书馆的内容也适用于此,请查看以下部分。如果不出意外,您可以将使用 Akka 的代码部分包装为一个单独的库。需要注意的是,如果您使用的是 Swing,您可能希望在与 GUI 交互之前使用 SwingUtilities.invokeLater 返回事件调度线程。 (此外,不要阻塞该线程。您可能想使用 futures 来避免这种情况,因此请考虑将您的库设计为 return futures。)

图书馆

你的例子似乎假设你的参与者有一个薄包装,或者至少是一个自下而上的设计,其中你的界面由你的实现细节驱动。相反,以更自上而下的方式设计库,首先弄清楚库的接口,然后(可能)使用 Akka 作为实现细节。 (这对于一般的库设计来说是一个好主意。)如果您已经使用 Akka 编写了一些东西,请不要担心,只需将接口与实现分开设计并将两者缝合在一起即可。如果这样做,则不需要特定的模式,因为无论您使用的是 Akka 还是正常的界面设计模式都适用。

例如,考虑一个编译器。编译方法签名可能很简单:

def compile(sources: List[File]): List[File]  // Returns a list of binaries

这里没有提到演员。但这可能会:

compileActor ? Compile(sources)

...并阻止结果。主要编译器参与者可能依赖于其他参与者,但没有理由通过 public API.

公开这些参与者