【问题标题】:Socket-based Message Factory基于套接字的消息工厂
【发布时间】:2010-10-12 04:09:12
【问题描述】:

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

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

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

虽然这个方案有效,但我觉得可能有更好的方法使用地图和接口......

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

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

【问题讨论】:

  • 这真的与Sockets无关。你只是在这里解析一个输入流。

标签: java design-patterns sockets messages factory-pattern


【解决方案1】:

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

所以你会像这样添加一个处理程序接口:

public interface MessageHandler {
    void handleTypeA(MessageA message);
    void handleTypeB(MessageB message);
}

然后您将拥有一个与您的 MessageCreator 基本相同的调度程序,除了它在处理程序上调用正确的方法而不是返回消息对象。

public interface MessageDispatcher {
    void createAndDispatch(DataInputStream input, MessageHandler handler);
}

然后实现几乎与您发布的第一个代码 sn-p 相同:

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 if 和之后所有的东西都是专门输入的,没有更多的转换。

【讨论】:

  • 是的,我想我会采用简单的切换方法。我只有 15-20 种不同类型的消息。我想我想做一些花哨的事情只是为了做一些很酷的事情……有时越简单越好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多