Java - 消息处理器设计模式

时间:2012-02-09 12:01:39

标签: java design-patterns message

我的Java程序将接收具有预定义结构的消息。每条消息都有多个字段,下一个字段可能具有某些值(应以某种方式处理),具体取决于当前字段值:

For example:

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

这里,根据FIELD1的类型,接下来应运行某些解码逻辑;所以应该使用某些解析器。

有这样的设计模式吗?

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

思想?

提前致谢。

4 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

最好的办法是定义一些枚举,其中包含每个字段的操作范围,然后创建一个通用的消息类。处理诸如验证您使用有效组合之类的事情的实用程序类也会很好。

不要过分思考它。采取最直接的方式,而不是依赖许多你可能不需要的抽象。

这种方法的一个优点是,使用JAX-RS和JAX-WS,您可以注释您的消息类,以便API可以自动将其转换为XML(也可能是JSON?),如果您需要公开您的邮件传递到外部系统。

答案 2 :(得分: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.
}

答案 3 :(得分:0)

对我来说,这似乎是State pattern的好候选人。

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

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

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