如何使Java GUI与Core完全分离

时间:2012-04-05 01:07:41

标签: java architecture software-design

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

GUI需要与核心

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

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

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

P.S: 我在这里讨论它的原因是在用Java编码时学习和探索这种软件的更好设计。我不是要求Observer Pattern文档或客户端服务器架构。可能还有其他可能的方法,我不知道。所以我期待任何想法,设计或框架。

2 个答案:

答案 0 :(得分:3)

对于4个用例中的3个,Oberserver Pattern真的是正确答案。

在您的描述级别上,您的核心可能会实现以下界面:

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。

答案 1 :(得分:1)

也许这个答案看起来有点老了,但普通的旧IC会怎么样?

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

然后您可以发送多个接口,只要所有接口都知道核心的入口点,您就可以开展业务。