Java - 消息处理器设计模式

问题描述:

我的Java程序将接收具有预定义结构的消息。Java - 消息处理器设计模式

For example: 

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

这里,根据FIELD1的类型,某些解码逻辑应:根据当前字段值的每个消息具有多个字段,下一个字段可以具有一定的值(并且应该在某些方式处理)接下来跑;所以应该使用某个解析器。

有没有这样的设计模式?

我想过为每种消息类型定义一个类,并逐步向某些实现提供输入。但是这对我来说听起来不太好。

想法?

在此先感谢。

除非您需要动态更改结构,否则我会编写一个使用开关和侦听器来处理消息的解析器。

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. 
} 

最好的办法是定义一些枚举,并为每个字段设置一系列操作,然后创建一个通用的消息类。处理诸如验证你正在使用有效组合的东西的实用程序类也是好的。

不要过时。采取最直接的方式,而不是依赖大量您可能不需要的抽象。

这种方法的优点之一是,使用JAX-RS和JAX-WS,您可以以API的方式自动将其转换为XML(也许是JSON?)的方式来注释消息类,如果需要将您的信息传递给外部系统。

+0

+1关于“不要过度考虑它......”做一些简单的工作,写一堆单元测试以确保它可以工作,然后你就可以重构为之后更多的涉及模式(更重要的是**如果**)您的需求增长。 – 2012-02-09 12:27:11

对我来说,这看起来很适合State pattern

您的解析器将有一个初始状态(抽象类或接口的实现),并要求此状态处理下一个标记。

根据令牌的值,状态修改上下文,并返回适当的下一个状态实例。你重复这个直到状态抛出一个异常,因为下一个标记不是期望的,或者直到最后一个标记被处理,并且最后一个状态不期望另一个标记。最后,解析失败,或者成功,上下文包含解析的数据。

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