2012-01-22 14 views
0

私はネットワークアプリケーションを分散テキストエディタのように機能させています。異なるメッセージは、アプリケーションのモジュール間またはこのアプリケーションの他のクライアントに送信されます。 この時点で、メッセージを転送する場所を区別するために、私はintタグを使用しています。 booleanメソッドがcanHandleという名前の各モジュールで呼び出され、trueの場合、そのモジュールに転送されます。デザインの改善 - メッセージ

問題は、アプリケーションのサイズが大きくなるにつれ、タグが増えているため、この問題を解決する方法が本当に嫌いです。 この説明からメッセージを認識する他の方法を提案することは可能ですか?メッセージはちょうどクラスのオブジェクトを保持し、ここではいくつかの属性(そのうちの一つは、タグである)

+0

あなたは地図を使っていますか? – Adrian

+0

メッセージのタグを調べることができます。タグがそのタグの1つを使用している場合はtrueを返します。 – Giannis

答えて

0

を持っている

PSはいくつかのアイデアです:

  1. Chain-of-responsibility patternを試してみてください - 各モジュールは、Aであります単一の処理オブジェクト。それは、メッセージを受け入れ、それをディスパッチするか、またはさらに通過する。最後のスタブ処理オブジェクトは、ハンドラが実際にメッセージを処理しなかったため例外をスローします。単一のメッセージを受け入れて、いくつかの基準に基づいて、それをディスパッチ集中メッセージングコンポーネント - それはあなたがハンドラを再配置し、それぞれに

  2. コンテンツベースのルータエンタープライズ統合パターンを異なるロジックを実装することができますので、このアプローチは非常に柔軟ですターゲット先の1つ。ルールは設定可能で、実行時に変更することもできます。利点は、すべてのルーティングが1か所で処理されることです。下側のルータは、すべての宛先が前面にあることを知っていなければなりません。

  3. enum - 多分古き良きenumは、ルーティングロジックを扱うことができますか? intタグを使用する代わりに、enumにグループ化してください(どのように使用するにしても良いアイデアです)。それぞれenumgetDestinationModule()の実装を追加しますか?

  4. タグをすべてスキップし、オブジェクト指向のテクニックを適切に使用します。各メッセージタイプは、汎用メッセージのサブタイプでなければなりません。あなたは何をすべきかを決定するために、すべてのメッセージタイプを聞かせするVisitorパターンを使用することができますより:Javaでビジター

    public class MembersList extends Message {/*...*/} 
    public class NewMember extends Message {/*...*/} 
    

    例:Is This Use of the "instanceof" Operator Considered Bad Design?

+0

はい私はすでにその技術を使用しています。私の問題は、どのように私はタグを使用せずに各メッセージの機能を区別することができます。たとえば、メンバータグのリストを配信するときには1、それが新しいメンバータグの名前を渡すときは2などです(したがって、受信者モジュールはこのメッセージの処理方法を知っています)。タグなしでこれを行うことは可能ですか? – Giannis

+0

私はこのためにenumをどのように使うことができるか考えてみてください。ありがとう – Giannis

+0

@latusaki:タグをまったく使用しないソリューション4を見てください。 –

0

を私はあなたがどのように見ていることを示唆していますJMSトピックは機能し、それらを使用するか、ホイールを改革して同様のことを書くことを検討します。
イベントの発行者はフィルタリングイベントに関与してはならず、パブリッシャーは単にイベントを発行するだけで、サブスクライバはイベントに関心があるかcanHandle()かに基づいてフィルタリングする必要があります。

さらに、canHandle()とは何かするのですか?Publish/Subscribe pattern

関連する問題