请注意,这是一篇长篇文章,抱歉,但我想要表达清楚我的观点:
我一直在思考如何将Swing GUI与Presentation和Business Logic分离。
在工作中,我必须为某些数据实现3 MD Excel导出,并创建一个小型的Swing对话框以配置导出。
我们没有像Spring这样的框架,因此我不得不自己实现它。
我希望完全将GUI与Business Logic分开,分别完成以下任务:
- 告诉BL从GUI开始工作
- 从BL向GUI报告进度
- 从BL向GUI报告日志记录
- 将BL结果委托给GUI
当然,GUI不应该注意到BL的实现,反之亦然。
我为上述所有任务创建了几个接口,例如ProgressListener
,LogMessageListener
,JobDoneListener
等,
由Business Logic触发。例如,如果Business Logic想要记录,它会调用:
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