2011-06-21 16 views
6

一連のメッセージを処理するのに最適な(Java)デザインパターンを理解しようとしています。各メッセージには、メッセージに含まれるデータの処理方法を決定する「タイプ」が含まれています。イベントを処理するデザインパターン

私はCommandパターンを検討していましたが、特定のCommandクラスの役割/関連性を理解するのは苦労しています。これまでは、受信者にメッセージ処理メソッドを実装するコードが含まれると判断しました。具体的なコマンドは、メッセージタイプに基づいてインスタンス化されます。しかし、私はどのように実際のメッセージデータを渡す必要があるか分かりません。具体的なコマンドのexecuteメソッドによって呼び出される適切な受信側メソッドを使用して、受信側コンストラクタに渡す必要がありますか?おそらくメッセージデータは受信側のアクションメソッドの呼び出しで渡されるべきでしょうか?

私はこのすべてにかなり新しいので、どんな指針も認められます。

これが役立つことがあります。

public interface Command { 
    public void execute(String msg); 
} 

public class AO1Command implements Command { 

    Receiver rec = new Receiver(); 

    public void execute(String msg) { 
     rec.admit(msg); 
    } 
} 

public class CommandFactory { 

    public protected CommandFactory() { } 

    public static Command getInstance(String type) { 

     if (type.equals("A01")) return new A01Command(); 
     else if (type.equals("A02")) return new A02Command(); 
     else { 
      return null; 
     } 
} 
+0

ちょっとしたメモです。文字列を比較するために、演算子を等価(==)に使用しないでください。 jvmの実装に応じて、 "hello" == "hello"はfalseと評価されるかもしれません。これは、==演算子がオブジェクトIDを使用するのは、両方のオブジェクトが同一である場合にのみ真であることを意味するためです。 "hello" == "hello"は実際には2つの文字列オブジェクトを構築するかもしれません - >同じではありません。代わりにequals()メソッドを使用してください – bennidi

+0

@bennidi:ありがとうございます。私は例を編集して - 元のコードをチェックしました:) – skyman

答えて

3

[OK]を、あなたのタイトルは、イベントを処理するためのパターンを言います。実際のイベントフレームワークについて話しているなら、Observer/Observableパターンが気になります。これは、何らかのタイプのイベントを発生させ、イベントハンドラにイベントの処理を依頼させたい場合に機能します。

問題のようですが、コマンドパターンの実装の詳細にあります。あなたは、あなたが立ち往生している場所を示すコードを投稿できますか?

パターンは相互排他的ではないことに注意してください。オブザーバブルパターンのコンテキストでコマンドパターンを使用できます。

EDIT - あなたのコードに基づいて、あなたは

1)CommandFactoryは、静的にする必要があります。
2)型をgetCommandメソッドに渡します。これも静的である必要があります。
3)あなたは、あなたが簡単に行うことができ、このための反射を必要としない

if (type == "type1") return new Command1(); 
else if (type == "type2") return new Command2(); 
... 

イムあなたは、私はそのあなたがやろうとしているものを過度に複雑言ってリフレクションを使用することはできませんとは言いません。さらに、メッセージ・タイプを表すStringをコマンド・クラス名の実装の詳細にバインドしますが、これは不要と思われます。

+0

これを拡張できますか?オブザーバを使用して、処理されるメッセージを収集することができる。それらがSwing GUIコンポーネントをクリックして生成された場合、Commandパターンは実際にメッセージを処理することと関連があるようです。 – Ben

+0

@Benはいもっと来ています – hvgotcodes

+0

すべてのコメントありがとうございました。私はこれをさらに進めています。私が扱っているメッセージはHL7(Health language 7)です。重要なことではなく、構造は似ています - 必要な行動だけが異なります。したがって、A01は「患者の承認」であり、A02は「患者の伝達」です。鍵は、各メッセージにタイプ(A01、A02など)があることです。だから助言を介してworkign: – skyman

1

あなたは正しい方向にあります。コマンドパターンは、概説された問題に対する適切な解決策です。

あなたの質問に答えるには、CommandFactoryにデータの差別化要因(この場合はメッセージ内のデータ)に基づいて適切なCommandインスタンスをインスタンス化します。次に、Commandインスタンスのメソッドを呼び出して、メッセージを渡します。このメソッドExecute(...)を呼び出すのが一般的な(最善の)習慣ですが、必要に応じて呼び出すことができます。

+0

私は上記でロードしたサンプルコードでこれを実行しようとしました。いくつかの例では、コマンドを実装する実際のコードを見てきましたが、コマンド受信メソッドでカプセル化されているため、コマンドの実行メソッドは単にreceiver.admit()と呼ばれます。これは、メッセージではなく、受信者がメッセージを保持すると思うのですか?私がここで混乱している場合、お詫びします.... – skyman

0

XMLを処理するためのJakarta Digesterプロジェクトを見てみましょう。ここにはで説明したイベントベースのAPIであるSAX実装がありますが、これは簡単な説明ですが、出発点として役立ちますあなたのために。

関連する問題