5

我正在做一个项目。我正在尝试将核心实现为可以从命令行甚至 Windows 服务运行的独立 jar 文件。核心将负责跟踪几个文件并发送一些通知电子邮件。问题是,保持 GUI 完全独立的最佳主意是什么?

GUI 需要与核心进行以下交互

  • 发送文件列表
  • 从核心接收有关这些文件已处理量的通知
  • 接收有关文件的状态通知,即发送/处理/失败等在 GUI 中显示
  • 如果有来自核心的传入消息,则接收信息

我用 Delphi 和 C 开发了这个软件。C 用于编写核心逻辑并使用 Windows 消息和回调,我在 C dll/服务上注册了 Delphi GUI。我很困惑如何在java中实现它。

  • 观察者模式?
  • 核心和gui之间的小型客户端/服务器通信?

PS:我在这里讨论它的原因是为了学习和探索用 Java 编码的此类软件的更好设计。我不是要求观察者模式文档或客户端服务器架构。可能还有其他我不知道的可能方式。所以我很期待任何想法、设计或框架。

4

2 回答 2

3

观察者模式确实是 4 个用例中的三个的正确答案。

在您的描述级别上,您的核心可能实现了以下接口:

public interface Core {

    sendFiles(List<File> files);
    registerProgressListener(ProgressListener listener);            
    registerStatusListener(StatusListener listener);
    registerMessageListener(MessageListener listener);
}

侦听器界面看起来与这个非常相似

public interface ProgressListener{
    madeProgress(ProgressEvent)
}

ProgressEvent(和其他 Event 类)应该是值对象,例如

public class ProgressEvent {
    public final double progress;
    public final String fileName;
    public ... // constructor
}

您可能希望您的核心和您的 gui 在不同的线程中运行。否则,您的 GUI 在内核运行时不会对任何事件做出反应。由于核心不应该知道关于 GUI 的任何事情,线程之间的切换应该由 GUI 完成,即侦听器应该注意使用SwingUtilities.invokeLaterinvokeAndWait更新 GUI。

于 2012-04-05T15:35:55.833 回答
1

也许这个答案看起来有点老派,但是普通的旧 IPC 呢?

使 GUI 将内核实例化为单独的线程,并且仅通过消息队列 (java.util.concurrent.*) 进行通信。使用它们发送文件列表、事件、进度报告和几乎所有内容。

然后你可以发布几个接口,只要所有接口都知道核心的入口点,你就可以做生意了。

于 2012-04-05T01:23:33.120 回答