【发布时间】:2017-07-17 06:17:04
【问题描述】:
我查看了这个问题的答案:Design pattern for handling multiple message types
我也在一条类似的船上。我的不同之处在于,我使用的是无法更改的现有 protobuf 架构。 protobuf 模式确实具有 messageType 属性。生成的代码看起来像
TradeMessage.parseFrom(byte[] bytes)
OtherMessage.parseFrom(byte[] bytes)
AnotherMessage.parseFrom(byte[] bytes)
所以现在我有一个工厂模式,当消息进入接收器时
MessageReceiver.java
Object parser = messageParserFactory.getParser(messageType);
获取解析器的类型
MessageParserFactory.java
public MessageParser getParser(int messageType) {
if (messageType = Constants.TRADE_MESSAGE) {
return new TradeParser();
} else if (messageType = Constants.OTHER_MESSAGE) {
return new OtherParser();
}
return null;
}
基本上对所有不同的消息类型重复工作,基本上只是包装生成的 parseFrom 方法。
public interface MessageParser {
void doParse(byte[] bytes);
}
TradeParser.java
public void doParse(byte[] bytes) {
TradeParser.parseFrom(bytes);
}
OtherParser.java
public void doParse(byte[] bytes) {
OtherParser.parseFrom(bytes);
}
AnotherParser.java
public void doParse(byte[] bytes) {
AnotherParser.parseFrom(bytes);
}
它可以工作,但有更好的方法吗,因为基本上我为每种消息类型创建的所有解析器都做完全相同的事情,只需调用parseFrom。
【问题讨论】:
-
您需要
MessageParser吗?为什么不直接返回解析后的实例? -
messageType =应该是messageType ==。我认为这只是一种伪代码? -
另外,如果
null是不受支持的消息类型,请不要返回,抛出异常。 -
@AndyTurner 不,我根本不需要消息解析器。这只是为了整理客户的主要入口点。实际上,我可以只为消息类型设置一个 switch 语句,然后返回解析后的对象。
-
@Michael ya 只是所有的伪代码。谢谢。
标签: java