我愿意为这种常见情况选择设计模式:

我有一个接收消息的模块(MessageListener)。
它收到的每个消息实际上都是一个对象(MyMessage1,MyMessage2,..)

My_Message1,My_Message2扩展了My_Message_Abstract。

现在,当消息由MessageListener对象(onMessage(..))检索时
我想根据消息实例执行不同的“命令” ..像这样:

onMessage(My_Message_Abstract msg)
{
   if (msg instance of My_Message1)
   {
      doSomething()..
   }
   else if(msg instance of My_Message2)
   {
     doSomethingElse()..
    }
}


我想摆脱这个锅炉,如果/然后代码,并有更好的未来-维护/动态/可插入性/整洁的方式。

所以我采用了Command设计模式。我发现我可以有这样的东西:

在MessageListener中具有一个映射:

Map<Integer, MessageCommand> messageCommandsMap = new HashMap<Integer, MessageCommand>();

..

sessionTargetMap.put(MSG_1_TYPE, new Message1Command());
sessionTargetMap.put(MSG_2_TYPE, new Message2Command());

(Message1Command,Message2Command implements from Command interface)

onMessage(My_Message_Abstract msg)
{
messageCommandsMap.get(msg.getType).executeCommand(msg);
}


我不喜欢以这种方式在MessageListeenr中使用哈希图的想法,我将所有命令都耦合到该对象(MessageListener)。

作为此线程提供的解决方案:
Long list of if statements in Java

知道我该如何改善吗?
我应该为此想法使用其他模式吗?

谢谢,

最佳答案

您可以拥有一个MessageCommand工厂,该工厂基本上知道给定消息类型将使用哪个MessageCommand。在工厂中,您可以使用映射或if / else来识别命令类。

现在,您的消息侦听器要求工厂根据类型提供适当的消息命令,然后每个消息命令都包含有效地处理命令(doSomethingElse)方法的逻辑。

代码外观的抽象概念:

   class MessageCommandFactory {
       Command get(MessageType messageType) {
         if(messageType == MSG_1_TYPE) {
           return new Message1Command();
         } else ...
       }

    class MessageListener {
    MessageCommandFactory messageCommandFactor;
        onMessage(My_Absctract_Message message) {
          Command command =  messageCommandFactory.get(message.getType());
          command.execute();
      }
   }

10-06 16:05