java - 使多态性打败那些 switch/case 语句的麻烦

标签 java design-patterns polymorphism conditional switch-statement

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

但是,我仍然发现自己无法摆脱那些 case 语句:我从主/决策字符串中读取每个字符,该字符串由随机重复的字符 A、B、C 或 D 组成,然后我检索从映射中执行命令的相关实现并调用其执行方法。

我的设计是这样的:

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

但是,当我阅读每条指令时,我又不得不求助于 case 语句:

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

显然,在这个过程中的某个地方,我成功地克服了多态性对 case 语句的优势。

会不会是我选择用来存储命令的那种数据结构?它很可能是一个永久性的数据结构,可以从中提取这些命令。

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

任何关于我下一步要一劳永逸地删除这些 case 语句的提示或进一步建议将不胜感激。非常感谢

最佳答案

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

((Command)myMap.get(instructionFromString)).execute();

如果 instructionFromString 是 char,则在执行 map 查找之前将其转换为 String,否则在您的 map 中使用 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());

其次是:

char instructionFromString = ....
myMap.get(instructionFromString).execute();

关于java - 使多态性打败那些 switch/case 语句的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1386673/

相关文章:

javascript - 如何在客户端实现服务器更新监听器

java - 将一种模型转换为另一种模型的设计模式

java - Java 中引用子进程和父进程是否属于多态性?

php - 在 Laravel Eloquent 中检索所有 morphedByMany 关系

java - Wicket 和 Java : Changes to page do not persist

java - young GC 暂停与 STW 暂停

java - lucene BooleanQuery.Builder 构建不起作用

Java 8 -> 根据其他列表对列表进行排序

c++ - 避免菱形继承(钻石问题)

c++ - 何时在 C++ 中创建 vtable?