gpt4 book ai didi

java - 基于套接字的消息工厂

转载 作者:太空宇宙 更新时间:2023-11-04 08:48:16 25 4
gpt4 key购买 nike

我正在寻找一些关于实现基本消息工厂的想法,该工厂从输入流中读取 header 并根据消息 header 中定义的类型创建适当的消息类型。

所以我有类似的东西(大致上......如果这里提出了更好的范例,我愿意改变设计)

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并强制转换为正确的子类。

有第三个(更好的?)选择吗?也许有一种方法可以使用模板来完成此任务。任何帮助表示赞赏。谢谢

编辑:我想重要的是要注意我想将消息“分派(dispatch)”到函数。所以本质上我真的很想这样做:

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))
}

因此,结合工厂和调度的模式将是完美的

最佳答案

让创建消息的人实际分派(dispatch)给处理程序怎么样?

所以你需要添加一个像这样的处理程序接口(interface):

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));
}
}

现在,代码中只有一个位置需要执行 switch 或 if/else,如果此后所有内容都经过专门键入,并且不再需要强制转换。

关于java - 基于套接字的消息工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3911621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com