我愿意为这种常见场景选择设计模式:
我有一个接收消息的模块(MessageListener)。它收到的每条消息实际上都是一个对象 (MyMessage1,MyMessage2,..)
My_Message1,My_Message2 扩展了 My_Message_Abstract。
现在,当 MessageListener Object(onMessage(..)) 检索到消息时,我想做一个不同的“命令”,这取决于消息实例.. 像这样:
onMessage(My_Message_Abstract msg)
{
if (msg instance of My_Message1)
{
doSomething()..
}
else if(msg instance of My_Message2)
{
doSomethingElse()..
}
}
我想摆脱这个锅炉 if/then 代码并拥有更好的未来维护/动态/插件能力/整洁的方式。
所以我采用了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 中的 hashmap 想法,因为我将所有命令耦合到该对象(MessageListener)。
作为该线程提供的解决方案: Java 中的 if 语句长列表
知道如何改进吗?Mybe 我应该为这个想法使用其他模式吗?
谢谢,