長文ですのでご了承ください。申し訳ありませんが、私の主張を明確にしたいと思います:
かなり長い間、Swing GUI をプレゼンテーションおよびビジネス ロジックから分離する方法を考えていました。職場では、エクスポートを構成するために小さな Swing ダイアログを使用して、一部のデータに対して 3 MD Excel エクスポートを実装する必要がありました。これには Spring のようなフレームワークを使用していないため、自分で実装する必要がありました。
GUI をビジネス ロジックから完全に分離したかったのです。ビジネス ロジックは、正確には次のタスクにあります。
- GUI からジョブを開始するように BL に指示する
- BL から GUI への進捗報告
- BL から GUI へのレポート ロギング
- BL の結果を GUI に委譲する
もちろん、GUI は BL の実装を通知するべきではなく、その逆も同様です。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