Kru*_*lur 5 java serialization design-patterns
我有一个由两个进程组成的应用程序,一个客户端进程带有(基于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);
}
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
然而,由于server.execute意味着序列化(这是在远程机器上执行),这种模式也不是没有可能做出全班序列化(因为RemoteRequest内部类不是静态的(仅仅是明确的:它是不是一个要求,即Request实现可以访问父实例,为了应用程序,它们可以是静态的).
当然,一种解决方案是为请求和响应创建单独的(可能是静态的内部)类,但这会损害可读性并使得理解执行流程变得更加困难.
我试图找到解决这个问题的任何标准模式,但是我找不到任何能够解决我对可读性的担忧的问题.
需要说明的是,这些操作会很多,而且操作通常很短.请注意,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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想明确一点,底层架构已经到位并且运行良好,这个解决方案的原因当然不是上面的例子.我唯一想要的是编写如上所述的代码,而不必为每个进程转换定义静态类.我希望通过给出这个例子,我不仅仅是复杂化了......