接受终端命令的设计模式

时间:2015-10-08 02:50:41

标签: java design-patterns terminal

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

更新 我确实使用了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();
    }

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

介绍一个通用命令界面并使用Map

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