【问题标题】:Design pattern for accepting terminal commands接受终端命令的设计模式
【发布时间】:2015-10-08 02:50:40
【问题描述】:

我正在重构一个接受来自终端的命令的 Java 应用程序。目前,有一个巨大的 if-else 结构来检查发出的命令并执行所需的方法。我想知道是否可以用一个完善的设计模式替换这个逻辑。 我查看了命令模式和策略模式,但在这种情况下似乎无法理解它。请提出建议。

更新: 我确实使用了 JCommander,但这并没有摆脱 if-else 结构。

    MyCommand cmd1 = new MyCommand();
    ...
    ...
    MyCommandN cmdN = new MyCommandN();
    JCommander cmd = new JCommander();
    cmd.addCommand("myCommand1", cmd1);
    ...
    ...
    cmd.addCommand("myCommandN", cmdN);
    try {
        cmd.parse(args);
        //
        if ("myCommand1".equals(cmd.getParsedCommand())) {
           System.out.println("running command1");
        }
        ...
        ...
        else if ("myCommandN".equals(cmd.getParsedCommand())) {
            // Sysout statements only for illustration. I call command specific methods here.
            System.out.println("running commandN");
        } else {
           cmd.usage();
        }
        //
    } catch (ParameterException ex) {
        System.out.println(ex.getMessage());
        cmd.usage();
    }

【问题讨论】:

标签: java design-patterns terminal


【解决方案1】:

引入一个通用的命令界面并使用一个地图

Map<String, Command> commands = new HashMap<String, Command>();
commands.put("myCommand1", new MyCommand());
commands.put("myCommandN", new MyCommandN());

JCommander cmd = new JCommander();
cmd.addCommand("myCommand1", cmd1);
...
cmd.addCommand("myCommandN", cmdN);
try {
    cmd.parse(args);

    Command command = commands.get(cmd.getParsedCommand());
    if(command == null){
       cmd.usage();
    }
    // execute command
}
 ...

【讨论】:

  • 太棒了!!正是我需要的......毕竟常识不是那么普遍:)
【解决方案2】:

使用 JCommander:http://jcommander.org/#Overview

还有其他选择。另见:Command Line Parsing: Commons CLI alternatives?

【讨论】:

  • 可能我之前不是很清楚。我正在使用 JCommander,但它并不能帮助我摆脱 if-esle 结构。我已经添加了问题的更新。如果您知道如何针对此问题进行更好的设计,请提供帮助。
  • 作为 if-else 的替代方法,如果您使用的是 Java 7+,则可以在 getParsedCommand() 字符串上使用开关
  • 我知道开关盒如何替代 if else。但是 if-else 不是这里的问题。问题是代码难以阅读且扩展性不强。想想我必须支持一个附加命令的情况。我将不得不修改现有结构以获得另一个 else-if 或 switch 语句。这是一个糟糕的编程设计的例子。设计模式帮助我们以更易读、松耦合和可扩展的方式设计我们的程序。您可能想开始阅读有关设计模式的内容。越早越好。
猜你喜欢
  • 2020-07-01
  • 1970-01-01
  • 2017-04-30
  • 2017-04-28
  • 2012-05-20
  • 1970-01-01
  • 2011-02-15
  • 2011-01-02
  • 2016-06-17
相关资源
最近更新 更多