制造多态的麻烦使那些开关/案例陈述失败

den*_*chr 5 java polymorphism conditional design-patterns switch-statement

继续前面的问题(这里这里),我实现了一个基本的命令模式,创建了我的命令类并编码到一个接口,所以当使用任何命令时,调用该execute()方法.

但是,我仍然发现自己无法动摇这些案例陈述:我正在从主/决定字符串中读取每个字符,字符串由随机的,重复的字符A,B,C或D组成,然后我检索相关的实现来自地图的命令并调用其execute方法.

我的设计是这样的:

public interface Command {
    void execute();
}

public class CommandA implements Command{
  //implements execute() method
}

private Map myMap= new HashMap();
myMap.put("A", new CommandA);
myMap.put("B", new CommandB);
myMap.put("C", new CommandC);
myMap.put("D", new CommandD);
Run Code Online (Sandbox Code Playgroud)

但是,当我阅读每条指令时,我再次诉诸案例陈述:

switch(instructionFromString){
case 'A':{myMap.get("A").execute(); break;}
case 'B':{myMap.get("B").execute(); break;}
case 'C':{myMap.get("C").execute(); break;}
case 'D':{myMap.get("D").execute(); break;}
Run Code Online (Sandbox Code Playgroud)

显然,在某种程度上我设法击败了多态性对案例陈述的优势.

它可能是我选择存储命令的那种数据结构吗?它很可能是一个永久的数据结构,只需从中提取这些命令.

我想到的另一件事是我在地图中使用的键/值命名.我试图从概念上将每个存储的命令链接到其相关指令的方式?即命令"A"的实现是用键'A'存储在地图上的,因此它可以匹配相应的指令"A"?在我看来,这似乎有点不太可能.

关于我下一步一劳永逸地删除这些案例陈述的任何暗示或进一步建议都将受到高度赞赏.提前谢谢了

ska*_*man 14

我可能在这里遗漏了一些东西,但不是switch陈述,而是有什么问题

((Command)myMap.get(instructionFromString)).execute();
Run Code Online (Sandbox Code Playgroud)

如果instructionFromString是a char,则String在执行地图查找之前将其转换为a ,否则使用Character地图中的键.

此外,如果您使用Java 5通用映射,则可以删除强制转换为Command.清理后的版本将是:

private Map<Character, Command> myMap = new HashMap<Character, Command>();
myMap.put('A', new CommandA());
myMap.put('B', new CommandB());
myMap.put('C', new CommandC());
myMap.put('D', new CommandD());
Run Code Online (Sandbox Code Playgroud)

其次是:

char instructionFromString = ....
myMap.get(instructionFromString).execute();
Run Code Online (Sandbox Code Playgroud)