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

标签 java design-patterns serialization

我有一个包含两个进程的应用程序,一个具有(基于 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/

相关文章:

Java多线程解析器

java - ClassLoader getResourceAsStream 返回 null

java - 如何将RDD的数据提取到Java ArrayList中?

design-patterns - 通过 redis 与推拉共享状态

java - 加载序列化对象

java - 序列化 Java 进程然后反序列化它——最好以非侵入方式

Java序列化问题

java - 通过 Commons 日志记录和 Log4j 2.0 增强代码覆盖率

oop - 何时在 OOP 中使用单例?

web-services - Java EE应用程序设计