私はシングルユーザーデスクトップバージョンにするために使用[物理学]シミュレーションフレームワークを持っています。このフレームワークは、例えば、教師はJavaプログラミングや特定の数学の詳細な知識なしにさまざまな種類のシミュレーション設定を構築できます。結局のところ、このアイデアは、クライアント/サーバのパラダイムをフレームワークに適用し、複数のクライアントが同じシミュレーションを使用して共同作業を行うことを可能にしました(すべてのクライアントでシミュレーションを同期させる)。
いくつかの追加の技術的な事実:
は、フレームワーク/シミュレーションは、MVCパターンに基づいて設計されています。
クライアントがシミュレーションへの変更を実行する場合(たとえば、スライダを動かしたりシミュレーション要素をマウスでドラッグしてSwing GUIを介して)、これらの変更はシミュレーションに適用される前にサーバによって承認されなければなりませんサーバーは他のすべてのクライアントに変更を配布するために注意を払わなければなりません。
承認自体は非常に簡単で、基本的には変更を受け入れる必要があるかどうかをタイムスタンプで決定するだけです(異なる遅延を持つクライアントによって引き起こされる問題を避けるために同じ時間に同じものが変更されます)。
問題、それぞれの質問:
私は今、ユーザー入力が(クライアント - を担当する基礎となるメッセージングシステムにそれらを渡すために検出(およびインターセプト)するための最もエレガントな方法は何思ったんだけどサーバー通信)?記載されたシナリオで一般的に使用されるパターンやベストプラクティスがありますか?
主な懸念事項の1つは、新しいコンテンツ(=シミュレーション)を構築するためにフレームワークを使用する人が考慮する必要がある新しい制約を導入することを避けることです。この意味では、既存のシミュレーションをできるだけ変更する必要はほとんどありません。
私はのような新しいインターフェイスを導入することについて考え:この場合の制約は、あらゆるタイプの変更リスナーが持っているということだろう
public interface Synchronizable {
public boolean appliesChanges();
}
私は仕事ができると思った
一つの解決策リスニングしている変更イベントを同期させたい場合は、このインタフェースを追加実装する必要があります。そうすることで、基盤となるフレームワークは、Synchronizableを実装するすべてのオブジェクトを、変更(イベント)をサーバーと(そして実際の変更リスナーにイベントを成功裏に転送して)検証する役割を担うプロキシオブジェクトと置き換えることができます。
「applyChanges」メソッドの背後にあるアイデアは、変更リスナーへのすべての呼び出しが実際に同期を必要とする変更をもたらすわけではないということです。たとえば、スウィングJSliderは、ノブが動かされるたびにイベントを生成するかもしれませんが、変更リスナーの具体的な実装は、ノブが解放された後でのみ(実際には値は調整されません)途中で発生する変更イベントは、いずれにしても効果がないため、サーバーに送信する必要はありません。このアプローチは便利ではなく、特にきれいではありませんでしたが、別の方法で問題を解決する他の可能性は考えられませんでしたか?
エンドユーザーは、どのイベントを同期させたいのかを明示的に考える必要があるという問題のほかに、特定のリスナーすべてに対して前述のインターフェイスを宣言し実装するという問題のほかに、すべての可能な変更リスナーに対して具体的なプロキシを実装しなくてもよいように、任意のタイプのイベントを処理する特定のメソッドを特定します。この問題を概説
例:
public interface SynchronizedChangeListener extends ChangeListener, Synchronizable {}
public interface SynchronizedPropertyChangeListener extends PropertyChangeListener, Synchronizable {}
public static void main(String[] args) {
SynchronizedChangeListener scl = new SynchronizedChangeListener() {
public void stateChanged(ChangeEvent e) {
System.out.println("Hello world - SynchronizedChangeListener");
}
public boolean appliesChanges() {
return true;
}
};
SynchronizedPropertyChangeListener spcl = new SynchronizedPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("Hello world - SynchronizedPropertyChangeListener");
}
public boolean appliesChanges() {
return true;
}
};
}
どのようにプロキシリスナーがのPropertyChangeEventsのために、それはそれはのstateChanged 'メソッドを呼び出す必要がありでChangeEventのためのに対し、「のpropertyChange」メソッドを呼び出す必要があることを知っているだろうか?反射はこの問題を解決することができますか?
あなたのご意見をお待ちしております - このトピックを扱っている文献や今後の方向性についてお礼を申し上げます。
+1私は間違っていると誰かが答えを与えることができます、私はHigherLevelMessagingについてお勧めしますが、問題の良い説明のために+1が、おそらくより良いフォーラム '学術的なdiscusions'ですhttp://programmers.stackexchange.com/です。 RMI、CobraまたはLowLevel ServersSocket – mKorbel