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

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)

现在我想明确一点,底层架构已经到位并且运行良好,这个解决方案的原因当然不是上面的例子.我唯一想要的是编写如上所述的代码,而不必为每个进程转换定义静态类.我希望通过给出这个例子,我不仅仅是复杂化了......

Kru*_*lur 0

实际上,我最终通过创建一个带有自定义序列化器的基类来解决这个问题。我还是希望最终能用语言来解决这个问题。