我的Java程序将接收具有预定义结构的消息。每条消息都有多个字段,下一个字段可能具有某些值(应以某种方式处理),具体取决于当前字段值:
For example:
1. FIELD1-FIELD2-CUSTOMDATA-OTHERDATA
2. FIELD1-FIELD2-FIELD3-CUSTOMDATA-OTHERDATA
这里,根据FIELD1的类型,接下来应运行某些解码逻辑;所以应该使用某些解析器。
有这样的设计模式吗?
我想过为每种消息类型定义一个类,并逐步为某些实现提供输入。但这对我来说听起来不太好。
思想?
提前致谢。
答案 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();
}