gpt4 book ai didi

java - 带有内部类的请求-响应流模式

转载 作者:搜寻专家 更新时间:2023-11-01 00:52:17 24 4
gpt4 key购买 nike

我有一个包含两个进程的应用程序,一个具有(基于 SWT 的)GUI 的客户端进程和一个服务器进程。客户端进程非常轻量级,这意味着许多 GUI 操作将不得不查询服务器进程或向其请求某些东西,例如响应用户单击按钮或选择菜单项。这意味着会有很多事件处理程序看起来像这样:

// Method invoked e.g. in response to the user choosing a menu item
void execute(Event event) {
// This code is executed on the client, and now we need some info off the server:
server.execute(new RemoteRequest() {
public void run() {
// This code is executed on the server, and we need to update the client
// GUI with current progress
final Result result = doSomeProcessing();
client.execute(new RemoteRequest() {
public void run() {
// This code is again executed on the client
updateUi(result);
}
}
}
});
}

但是,由于 server.execute 意味着序列化(它在远程机器上执行),如果不使整个类可序列化(因为 RemoteRequest 内部类不是静态的(需要明确的是:Request 实现可以访问父实例并不是必需的,为了应用程序的缘故,它们可以是静态的)。

当然,一种解决方案是为 Request 和 Response 创建单独的(可能是静态内部)类,但这会损害可读性并使执行流程更难理解。

我试图找到任何标准模式来解决这个问题,但我没有找到任何可以解决我对可读性的担忧的东西。

需要明确的是,这些操作会有很多,而且操作通常都很短。请注意,Future 对象在这里并不完全有用,因为在许多情况下,对服务器的一个请求需要在客户端执行多项操作(通常是变化的),并且它也不总是返回结果.

理想情况下,我希望能够编写这样的代码:(现在是明显的伪代码,请忽略细节中明显的错误)

String personName = nameField.getText();
async exec on server {
String personAddress = database.find(personName);
async exec on client {
addressField.setText(personAddress);
}
Order[] orders = database.searchOrderHistory(personName);
async exec on client {
orderListViewer.setInput(orders);
}
}

现在我想明确一点,底层架构已经到位并且运行良好,这个解决方案存在的原因当然不是上面的例子。我唯一要寻找的是一种编写上述代码的方法,而不必为每个流程转换定义静态类。我希望我没有通过举这个例子把事情复杂化...

最佳答案

我的偏好是使用 Command Pattern和通用异步回调。例如,这种方法在 GWT 中用于与服务器通信。命令是可序列化的,AsyncCallback 是一个接口(interface)。

沿着这些线的东西:

    // from the client
server.execute(new GetResultCommand(args), new AsyncCallback<Result>()
{
public void onSuccess(Result result) {
updateUi(); // happens on the client
}
});

然后服务器需要接收一个命令,对其进行处理并发出带有结果的适当响应。

关于java - 带有内部类的请求-响应流模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9619931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com