1

以下を得るためにどの設計パターンを採用すべきかについて、1 つの大きな疑問があります。

変数a1を更新する実行中のスレッドを持つ静的にできないクラスAがあります。

複数のスイング クラス (B、C、D) は、変数 A.a1 の現在の値で JLabel b1、c1、d1 を更新する必要があります。

A は静的な B ではないため、C、D は b1.setText(A.getInstance().getA1()); のようなことはできません。

また、A には特定の役割があり、毎回作成することはできないため、毎回 A の新しいインスタンスを作成することは意味がありません。

A には a1 変数を更新するスレッドがあるため、読み取りと書き込みのためにこの変数を共有する A、B、C、D の間で同期の問題もあると思います。

Observerパターンを考えましたが、それでも各B、C、DをAに登録する必要があり、同期の問題は解決しません。

4

1 に答える 1

1

A の存在を B、C、および D から切り離したい場合は、仲介者として機能するProxyオブジェクトを作成する必要があります。このオブジェクトは、A のインスタンスに到達する方法を認識し、利用できない場合にアドホックな応答を行います。

同期の問題を軽減するために、値の連続した変更を保持するメッセージ キューを使用することをお勧めしa1ます。プロキシはこのキューをポーリングし、それに応じてスイング クラスを更新します。実際、プロキシはObserverその目的のためにパターンを実装する場合があります。A で作業しているスレッドは、更新をメッセージ キューにポストする必要があります。これを 1 対 1 のプロデューサーとコンシューマーのセットアップに変えることで、ConcurrentLinkedQueue.

キュー内のProxy値ごとにスイング コンポーネントの更新を実行する必要さえありませんが、最新のものだけを実行する必要があります (すべての中間のものを破棄します)。

更新: SwingWorkerクラスは、その目的に適しているようです。

于 2013-03-08T15:31:55.913 に答える