Java消息处理器设计模式

Java消息处理器设计模式,java,design-patterns,message,Java,Design Patterns,Message,我的Java程序将接收具有预定义结构的消息。每条消息都有多个字段,根据当前字段值,下一个字段可能有特定值(并且应以特定方式处理): For example: 1. FIELD1-FIELD2-CUSTOMDATA-OTHERDATA 2. FIELD1-FIELD2-FIELD3-CUSTOMDATA-OTHERDATA 这里,根据FIELD1的类型,接下来应该运行某些解码逻辑;所以应该使用特定的解析器 有这样的设计模式吗 我曾考虑为每种消息类型定义一个类,并逐步向特定实现提供输入。但这

我的Java程序将接收具有预定义结构的消息。每条消息都有多个字段,根据当前字段值,下一个字段可能有特定值(并且应以特定方式处理):

For example:

 1. FIELD1-FIELD2-CUSTOMDATA-OTHERDATA
 2. FIELD1-FIELD2-FIELD3-CUSTOMDATA-OTHERDATA
这里,根据FIELD1的类型,接下来应该运行某些解码逻辑;所以应该使用特定的解析器

有这样的设计模式吗

我曾考虑为每种消息类型定义一个类,并逐步向特定实现提供输入。但这对我来说听起来不太好

想法


提前感谢。

或?

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

不要想得太多。采取最直接的方式,而不是依赖于很多你可能不需要的抽象概念


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

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

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

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

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

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关于“不要想得太多…”现在就做一些简单的事情,编写一系列单元测试以确保它能工作,然后当您的需求增长时(更重要的是,如果需求增长的话),您将能够重构到更复杂的模式。