7

長文ですのでご了承ください。申し訳ありませんが、私の主張を明確にしたいと思います:

かなり長い間、Swing GUI をプレゼンテーションおよびビジネス ロジックから分離する方法を考えていました。職場では、エクスポートを構成するために小さな Swing ダイアログを使用して、一部のデータに対して 3 MD Excel エクスポートを実装する必要がありました。これには Spring のようなフレームワークを使用していないため、自分で実装する必要がありました。

GUI をビジネス ロジックから完全に分離したかったのです。ビジネス ロジックは、正確には次のタスクにあります。

  • GUI からジョブを開始するように BL に指示する
  • BL から GUI への進捗報告
  • BL から GUI へのレポート ロギング
  • BL の結果を GUI に委譲する

もちろん、GUI は BL の実装を通知するべきではなく、その逆も同様です。ProgressListenerLogMessageListener、など、上記のすべてのタスク用に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

4

2 に答える 2

2

基本的に、あなたのアーキテクチャは私には問題ないようです。設定した多数のリスナーのせいでしょうか。

これに対する解決策は、次のいずれかです。

a) 特定のイベントのサブクラスを持つ汎用 Event クラスを持つ。ビジターを使用して実際のリスナーを実装できます。

b)イベントバスを使用する(たとえば、グアバを参照)。イベント バス アーキテクチャでは、モデルがイベントをイベント バスに発行し、UI オブジェクトがイベント バスからのイベントをリッスンしてフィルター処理します。

一部のシステムでは、リスナー メソッドを宣言するためにアノテーションを使用することさえできます。

于 2015-04-22T15:32:53.977 に答える