【问题标题】:how to keep Java GUI totally separate from Core如何使 Java GUI 与 Core 完全分离
【发布时间】:2012-04-18 18:25:12
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java architecture software-design


    【解决方案1】:

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

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

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

    【讨论】:

    • 无需在不同进程中运行gui和core
    【解决方案2】:

    观察者模式确实是 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。

    【讨论】:

    • 完美。在我选择您的回复作为答案之前等待更多回复。
    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2013-04-25
    • 2012-10-01
    • 1970-01-01
    • 2019-12-25
    相关资源
    最近更新 更多