ich die Antworten auf diese Frage sah: Design pattern for handling multiple message typesDesign für mehrere Nachrichtentypen, aber Subklassen alle das gleiche tun
und ich bin in einem ähnlichen Boot. Der Unterschied, den ich habe, ist, dass ich ein existierendes Protobuf-Schema verwende, das ich nicht ändern kann. Das Protobuf-Schema verfügt über die Eigenschaft messageType. Der generierte Code sieht aus wie
TradeMessage.parseFrom(byte[] bytes)
OtherMessage.parseFrom(byte[] bytes)
AnotherMessage.parseFrom(byte[] bytes)
So jetzt ich eine Fabrik Muster haben, dass, wenn eine Nachricht im Empfänger kommt
MessageReceiver.java
Object parser = messageParserFactory.getParser(messageType);
die Art der Parser Get
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;
}
Grundsätzlich wiederholt arbeiten für alle verschiedenen Nachrichtentypen, die im Wesentlichen nur die generierte parseFrom-Methode umbrechen.
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);
}
Es funktioniert, aber gibt es einen besseren Weg, um alle da im Grunde die Parser ich für jeden Nachrichtentyp erstellen Sie genau die gleiche Sache und rufen Sie einfach parseFrom
.
Benötigen Sie den 'MessageParser' überhaupt? Warum geben Sie nicht einfach die geparste Instanz zurück? –
'messageType =' sollte 'messageType ==' sein. Ich nehme an, das ist nur ein bisschen Pseudocode? – Michael
Geben Sie auch nicht 'null' zurück, wenn es sich um einen nicht unterstützten Nachrichtentyp handelt, werfen Sie eine Ausnahme aus. – Michael