繁体   English   中英

基于套接字的消息工厂

[英]Socket-based Message Factory

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

所以我有一个类似的东西(如果在这里提出更好的范例,我大概愿意改变设计)

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

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

编辑:我想重要的是要注意我想“发送”消息给一个函数。 所以本质上我真的想这样做:

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

因此,将工厂与调度结合在一起的模式将是完美的

让创建消息的人实际分派给处理程序怎么样。

因此,您需要添加如下处理程序接口:

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

现在,在代码中只有一个位置,您需要进行切换,或者在是否/之后是否/之后是否一切都经过专门键入,并且不再需要强制转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM