我正在寻找一些关于实现基本消息工厂的想法,该工厂从输入流中读取标头,并根据消息头中定义的类型创建相应的消息类型。
所以我有类似的东西(粗略......如果这里有更好的范例,我愿意改变设计)
class MessageHeader {
public String type;
}
class MessageA extends Message {
public static final String MESSAGE_TYPE = "MSGA";
public MessageA (DataInputStream din) {
var1 = din.readInt ();
var2 = din.readInt ()
// etc
}
}
我基本上想做这样的事情:
MessageHeader header = ... read in from stream.
if (header.type == MessageA.MESSAGE_TYPE) {
return new MessageA (din);
} else if (header.type == MessageB.MESSAGE_TYPE) {
return new MessageB (din);
}
虽然这个方案有效但我觉得有一种更好的方法可以使用Map和Interface以某种方式......
public interface MessageCreator {
public Message create (DataInputStream);
}
Map <String, MessageCreater> factory = new Map <String, MessageCreator> ();
factory.put (MessageTypeA.MESSAGE_TYPE, new MessageCreator () {
public Message create (DataInputStream din) {
return new MessageA (din); }});
...
// Read message header
Message createdMessage = Map.get (header.type).create (din);
但是每当我想使用该消息时,我必须使用instanceof并强制转换为正确的子类。
是否有第3个(更好?)选项?也许有一种方法可以使用模板来实现这一目标。任何帮助表示赞赏。感谢
编辑:我想重要的是要注意我要将消息“发送”给一个函数。所以基本上我真的想这样做:
MessageHeader header = ... read in from stream.
if (header.type == MessageA.MESSAGE_TYPE) {
handleMessageA (new MessageA (din));
} else if (header.type == MessageB.MESSAGE_TYPE) {
handleMessageB (new MessageB (din))
}
因此,包含工厂和调度的模式将是完美的
答案 0 :(得分:1)
如何让创建消息的人实际派遣到处理程序。
所以你要添加一个这样的处理程序界面:
public interface MessageHandler {
void handleTypeA(MessageA message);
void handleTypeB(MessageB message);
}
然后你会有一个与MessageCreator基本相同的调度程序,除了它在处理程序上调用正确的方法而不是返回消息对象。
public interface MessageDispatcher {
void createAndDispatch(DataInputStream input, MessageHandler handler);
}
然后,实现几乎与您发布的第一个代码段完全相同:
public void createAndDispatch(DataInputStream input, MessageHandler handler) {
MessageHeader header = ... read in from stream.
if (header.type == MessageA.MESSAGE_TYPE) {
handler.handleTypeA(new MessageA (din));
} else if (header.type == MessageB.MESSAGE_TYPE) {
handler.handleTypeB(new MessageB (din));
}
}
现在你只需要在代码中有一个你需要进行切换的位置,或者如果/之后,那么所有内容都是专门输入的,并且没有更多的转换。