5

私はプロジェクトに取り組んでいます。コマンドラインまたはWindowsサービスからも実行できる独立したjarファイルとしてコアを実装しようとしています。コアは、いくつかのファイルを追跡し、通知メールを送信する責任があります。問題は、GUI を完全に独立させておくための最良のアイデアは何でしょうか?

GUI には、コアとの次の対話が必要です。

  • ファイルのリストを送信
  • それらのファイルが処理された量に関するコアからの通知を受け取ります
  • ファイルに関するステータス通知を受け取ります。つまり、SEND/Processing/Failed などを GUI に表示します。
  • コアからの着信メッセージがある場合に情報を受け取る

このソフトウェアを Delphi と C で開発しました。C を使用してコア ロジックをコーディングし、Windows メッセージとコールバックを使用して、C dll/サービスに Delphi GUI を登録しました。Javaで実装する方法がわかりません。

  • オブザーバーパターン?
  • コアと GUI 間の小さなクライアント/サーバー通信?

PS: 私がここで議論している理由は、Java でコーディングされた場合のそのようなソフトウェアのより良い設計を学び、探求するためです。オブザーバー パターンのドキュメントやクライアント サーバー アーキテクチャを求めているわけではありません。私が気付いていない他の可能な手段があるかもしれません。ですから、アイデア、デザイン、フレームワークを楽しみにしています。

4

2 に答える 2

3

Oberserver パターンは、4 つのユース ケースのうち 3 つに対する正しい答えです。

説明のレベルでは、コアによって次のインターフェイスが実装されている場合があります。

public interface Core {

    sendFiles(List<File> files);
    registerProgressListener(ProgressListener listener);            
    registerStatusListener(StatusListener listener);
    registerMessageListener(MessageListener listener);
}

リスナーのインターフェースは、これに非常によく似ています

public interface ProgressListener{
    madeProgress(ProgressEvent)
}

ProgressEvent (およびその他の Event クラス) は値オブジェクトである必要があります。

public class ProgressEvent {
    public final double progress;
    public final String fileName;
    public ... // constructor
}

おそらく、コアと GUI を別のスレッドで実行したいでしょう。そうしないと、コアの実行中に GUI がイベントに反応しなくなります。コアは GUI について何も認識してはならないため、スレッド間のハンドオーバーは GUI で行う必要があります。つまり、リスナーは GUI の使用SwingUtilities.invokeLaterまたはinvokeAndWait更新に注意する必要があります。

于 2012-04-05T15:35:55.833 に答える
1

たぶん、この答えは少し古風に見えるかもしれませんが、普通の古い IPC はどうでしょうか?

GUI でコアを別のスレッドとしてインスタンス化し、メッセージ キュー (java.util.concurrent.*) を介してのみ通信します。それらを使用して、ファイルのリスト、イベント、進捗レポート、および事実上何でも送信します。

次に、すべてのインターフェイスがコアのエントリ ポイントを認識している限り、いくつかのインターフェイスを出荷できます。

于 2012-04-05T01:23:33.120 に答える