2012-02-09 92 views
1

我的Java程序將接收具有預定義結構的消息。Java - 消息處理器設計模式

For example: 

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

這裏,根據FIELD1的類型,某些解碼邏輯應:根據當前字段值的每個消息具有多個字段,下一個字段可以具有一定的值(並且應該在某些方式處理)接下來跑;所以應該使用某個解析器。

有沒有這樣的設計模式?

我想過爲每種消息類型定義一個類,並逐步向某些實現提供輸入。但是這對我來說聽起來不太好。

想法?

在此先感謝。

回答

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

最好的辦法是定義一些枚舉,併爲每個字段設置一系列操作,然後創建一個通用的消息類。處理諸如驗證你正在使用有效組合的東西的實用程序類也是好的。

不要過時。採取最直接的方式,而不是依賴大量您可能不需要的抽象。

這種方法的優點之一是,使用JAX-RS和JAX-WS,您可以以API的方式自動將其轉換爲XML(也許是JSON?)的方式來註釋消息類,如果需要將您的信息傳遞給外部系統。

+0

+1關於「不要過度考慮它......」做一些簡單的工作,寫一堆單元測試以確保它可以工作,然後你就可以重構爲之後更多的涉及模式(更重要的是**如果**)您的需求增長。 – 2012-02-09 12:27:11

0

對我來說,這看起來很適合State pattern

您的解析器將有一個初始狀態(抽象類或接口的實現),並要求此狀態處理下一個標記。

根據令牌的值,狀態修改上下文,並返回適當的下一個狀態實例。你重複這個直到狀態拋出一個異常,因爲下一個標記不是期望的,或者直到最後一個標記被處理,並且最後一個狀態不期望另一個標記。最後,解析失敗,或者成功,上下文包含解析的數據。

public interface State { 
    State nextState(Context context, String token) throws UnexpectedTokenException; 
    boolean isFinal(); 
}