2012-02-09 4 views
1

Javaプログラムは、あらかじめ定義された構造のメッセージを受信します。べき、FIELD1の種類に応じて、特定の復号化ロジックをJava - メッセージプロセッサデザインパターン

ここ
For example: 

1. FIELD1-FIELD2-CUSTOMDATA-OTHERDATA 
2. FIELD1-FIELD2-FIELD3-CUSTOMDATA-OTHERDATA 

:各メッセージは複数のフィールドを有し、次のフィールドは、現在のフィールドの値に応じて特定の値を(そして特定の方法で処理しなければならない)を有していてもよいです次に実行する。したがって、特定のパーサーを使用する必要があります。

このようなデザインパターンはありますか?

私は各メッセージタイプにクラスを定義し、特定の実装にステップごとに入力を提供することを考えました。しかし、これは私にとってあまりにも良いとは思わない。

思考?

ありがとうございます。

答えて

1

構造を動的に変更する必要がない場合は、スイッチとリスナーを使用してメッセージを処理するパーサーを作成します。

interface MessageListener { 
    void message1(String field2, Object customData, Object otherData); 
    void message2(String field2, String field3, Object customData, Object otherData); 
    // other message types 
} 


MessageListener ml = 
String firstField = getField(); 
switch(firstField) { 
    case messageType1: { 
     String field2 = getField(); 
     Object customData = getData(); 
     Object otherData = getData(); 
     ml.message1(field2, customData, otherData); 
     break; 
    } 
    case messageType2: { 
     String field2 = getField(); 
     String field3 = getField(); 
     Object customData = getData(); 
     Object otherData = getData(); 
     ml.message2(field2, field3, customData, otherData); 
     break; 
    } 
    //parse other message types 

    default: 
     // report unknown message type. 
} 
1

各フィールドのアクション範囲でいくつかの列挙型を定義し、汎用メッセージクラスを作成することをお勧めします。有効な組み合わせを使用していることを確認するようなことを処理するユーティリティクラスも良いでしょう。

それを考え直してはいけません。あなたが必要としない抽象化の多くに頼るのではなく、最も直接的な方法を取ってください。

このアプローチの利点の1つは、JAX-RSとJAX-WSを使用すると、メッセージクラスを注釈付けして、必要に応じてAPIが自動的にXMLに変換する(多分JSONですか?外部システムにメッセージを渡す

+0

+1「これ以上考えないでください...」今すぐ簡単なことをして、単体テストを書いて動作することを確認してから、後で(そしてもっと重要なことに** **もし**)あなたの要件が成長すると、より複雑なパターンになります。 –

0

これは私にとってState patternの良い候補のようです。

パーサーは、初期状態(抽象クラ​​スまたはインターフェイスの実装)を持ち、次のトークンを処理するようにこの状態を要求します。

トークンの値によって、状態はコンテキストを変更し、適切な次の状態インスタンスを返します。そして、次のトークンが期待されないため、または最後のトークンが処理され、最後の状態が別のトークンを期待しないので、状態が例外をスローするまでこれを繰り返します。最後に、解析が失敗したか、成功し、コンテキストに解析されたデータが含まれています。

public interface State { 
    State nextState(Context context, String token) throws UnexpectedTokenException; 
    boolean isFinal(); 
} 
関連する問題