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?)的方式来注释消息类,如果需要将您的信息传递给外部系统。
答
对我来说,这看起来很适合State pattern。
您的解析器将有一个初始状态(抽象类或接口的实现),并要求此状态处理下一个标记。
根据令牌的值,状态修改上下文,并返回适当的下一个状态实例。你重复这个直到状态抛出一个异常,因为下一个标记不是期望的,或者直到最后一个标记被处理,并且最后一个状态不期望另一个标记。最后,解析失败,或者成功,上下文包含解析的数据。
public interface State {
State nextState(Context context, String token) throws UnexpectedTokenException;
boolean isFinal();
}
+1关于“不要过度考虑它......”做一些简单的工作,写一堆单元测试以确保它可以工作,然后你就可以重构为之后更多的涉及模式(更重要的是**如果**)您的需求增长。 – 2012-02-09 12:27:11