请注意,这是一个很长的帖子。很抱歉,但我想澄清一下:
很长一段时间以来,我一直在想如何将 Swing GUI 与 Presentation 和 Business Logic 分开。在工作中,我必须使用一个小的 Swing 对话框为一些数据实现 3 MD Excel 导出来配置导出。我们不使用像 Spring 这样的框架,所以我必须自己实现它。
我想将 GUI 与业务逻辑完全分开,它们的任务如下:
- 告诉 BL 从 GUI 开始它的工作
- 从 BL 向 GUI 报告进度
- 从 BL 到 GUI 的报告记录
- 将 BL 结果委托给 GUI
当然 GUI 不应该有 BL 实现的通知,反之亦然。我为上面的所有任务创建了几个接口,例如 a ProgressListener
、LogMessageListener
、JobDoneListener
等,由业务逻辑触发。例如,如果业务逻辑想要讲述日志记录,它会调用
fireLogListeners("Job has been started");
实现公共接口 LogListener + 的类附加到 BL,现在将收到有关“作业已启动”日志消息的通知。所有这些监听器此时都由 GUI 本身实现,一般看起来像这样:
public class ExportDialog extends JDialog implements ProgressListener, LogListener, JobFinishedListener, ErrorListener {
@Override
public void jobFinished(Object result){
// Create Save File dialog and save exported Data to file.
}
@Override
public void reportProgress(int steps){
progressBar.setValue(progressBar.getValue()+steps);
}
@Override
public void errorOccured(Exception ex, String additionalMessage){
ExceptionDialog dialog = new ExceptionDialog(additionalMessage, ex);
dialog.open();
}
// etc.
}
“GUI 和 BL 创建类”只是将 GUI(作为所有这些侦听器的接口)附加到 BL,如下所示:
exportJob.addProgressListener(uiDialog);
exportJob.addLogListener(uiDialog);
exportJob.addJobFinishedListener(uiDialog);
exportJob.start();
我现在对此非常不确定,因为所有这些新创建的侦听器接口看起来很奇怪。你有什么想法?如何将 Swing GUI 组件与 BL 分开?
编辑: 为了更好地展示目的,我在 eclipse file-upload.net/download-9065013/exampleWorkspace.zip.html 中创建了一个演示工作区,我也将它粘贴到了 pastebin,但最好在 eclipse 中导入这些类,很多代码http: //pastebin.com/LR51Ummp