【问题标题】:Command Design Pattern命令设计模式
【发布时间】:2015-12-21 07:24:31
【问题描述】:

我创建了一个 shell(如命令提示符)。我正在接受用户输入并比较 if 条件中的字符串以执行输入的命令。因此,我的 java 代码中有很多 if 语句,这是不理想的。我正在寻找一种更好的方法来实现这部分代码。是否可以存储我所有的命令,然后遍历数组以查看需要执行哪些命令?有什么好的建议吗?

if (cmd[0].equals("pwd"))   {`
                command = new Pwd();
                invoker = new Invoker(command);
                invoker.action();
              } 
else if (cmd[0].equals("ls"))  {
              command = new Ls();
              invoker = new Invoker(command); 
              invoker.action(); //this executes the command
              }

...等等

【问题讨论】:

  • 使用Map,卢克。或switch 声明,但地图允许更多动态行为,例如扩展命令列表的能力。
  • 感谢您的链接。真的很有帮助!

标签: java arrays


【解决方案1】:

你可以试试HashMap<String, Command>()

Map<String, Command> commandMap = new HashMap<String, Command>();
commandMap.put("pwd", new Pwd());
commandMap.put("ls", new Ls());

if(commandMap.containsKey(cmd[0])) {
    new Invoker(commandMap.get(cmd[0])).action();
}

【讨论】:

    【解决方案2】:

    作为地图的替代方案,您可以将枚举用于一组固定的命令。 Java 8 的代码相当简洁:

    class enum Command {
        PWD("pwd", Context::pwd),
        LS("ls", Context::ls);
    
        private final String command;
        private final Runnable action;
    
        Command(String command, Runnable action) {
            this.command = command;
            this.action = action;
        }
    
        public static run(String command) {
            Arrays.stream(values())
                .filter(c -> c.commmand.equals(command))
                .findAny().ifPresent(c -> c.action.run());
        }
    }
    

    【讨论】: