我愿意为这种常见情况选择设计模式:
我有一个接收消息的模块(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();
}
}