微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 如何在不使用Spring等时将Swing GUI与Business Logic分开

请注意,这是一篇很长的帖子.对不起,但我想澄清一点:

我想知道如何在很长一段时间内将Swing GUI与Presentation和Business Logic分开.
在工作中,我必须使用一个小的Swing对话框为一些数据实现3 MD Excel Export以配置导出.
我们不使用像Spring这样的框架,所以我必须自己实现它.

我想将GUI与Business Logic完全分开,后者具有以下精确的后续任务:

>告诉BL从GUI开始工作
>报告从BL到GUI的进度
>报告从BL到GUI的日志记录
>将BL结果委托给GUI

当然,GUI不应该注意BL实现,反之亦然.
我为上述所有任务创建了几个接口,例如: G. ProgressListener,LogMessageListener,JobDoneListener,
等等,由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中创建了一个Demo工作区file-upload.net/download-9065013/exampleWorkspace.zip.html
我也把它粘贴到了pastebin,但最好在eclipse中导入那些类,相当多的代码http://pastebin.com/LR51UmMp

解决方法

一些东西.

我在ExportFunction类中没有uiDialog代码.整个执行方法应该只是主类中的代码. ExportFunctions的责任是’导出’而不是’show gui’.

public static void main(String[] args) {
    ExportFunction exporter = new ExportFunction();

    final ExportUIDialog uiDialog = new ExportUIDialog();
    uiDialog.addActionPerformedListener(exporter);

    uiDialog.pack();
    uiDialog.setVisible(true);
}

(不需要Swing.invokelater())

你好像过度工程了.我不知道为什么你会期望有很多线程同时运行.当您按下按钮时,您只希望一个线程正确运行?然后就不需要有一个actionPerformedListener数组.

而不是这个:

button.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        if (startConditionsFulfilled()) {
            fireActionListener(ActionPerformedListener.STARTJOB);
        }
    }

});

为什么不呢:

final ExportJob exportJob = new ExportJob();
exportJob.addJobFinishedListener(this);
exportJob.addLogListener(this);

button.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        exportJob.start();
    }
});

这样你就可以摆脱出真正用于任何目的的ExportFunction.

你似乎有很多听众阵列.除非你真的需要它们,否则我不会打扰它们并保持尽可能简单.

代替 :

Thread.sleep(1000);
fireLogListener("Excel Sheet 2 created");
Thread.sleep(1000);

只有:

Thread.sleep(1000);
log("Excelt Sheet 1 created");
Thread.sleep(1000);

日志是:

private void log(final String message) {
    ((DefaultListModel<String>) list.getModel()).addElement(message);
}

这样你就可以保持简单和清洁.

GUI不应该知道BL,但BL不知何故必须告诉GUI该做什么.您可以使用大量接口无限抽象,但在99.99%的应用程序中,这不是必需的,尤其是您的应用程序看起来相当简单.

因此,虽然您编写的代码非常好,但我会尝试简化并减少接口.它不能保证那么多工程.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?