java - 处理控制台命令的最佳 Java 设计模式

标签 java design-patterns console

我正在尝试创建一个控制台来处理来自字符串的控制台命令。

目前我正在使用 if 语句来检查每个命令,如下所示:

if (command.contains("new train")) {
    command = command.replace("new train ", "");
    Train t = new Train();
    t.setCode(command);
    ServiceProvider.getTrainService().saveOrUpdate(t);
    responeHandler("train " + command + " created");
}

但我认为这不是最好的解决方案。

我想知道是否已经有一个好的设计模式来解决这样的问题?

我已经研究了 builderfactory 模式,但无法真正确定它们是否是正确的选择。

最佳答案

也许是一个命令工厂模式?

interface Command {
    void execute();
}

interface CommandFactory {
    boolean canCreate(String input);
    Command fromInput(String input); // or return Optional so it can be a FunctionalInterface
}

class TrainCommand implements Command {
    String train;
    public TrainCommand(String t) {  train = t; }
    public void execute() {
        ServiceProvider.getTrainService().saveOrUpdate(t);
    }
}

class TrainCommandFactory {
    public boolean canCreate(String t) {
        return t.contains("new train ");
    }
    public Command fromString(String c) {
        return new TrainCommand(c.replace("new train ", ""));
    }
}

还有一个Singleton Composite CommandFactory,它迭代所有已知的命令工厂:

class CommandFactories implements CommandFactory {
    private static final CommandFactories INSTANCE;
    private List<CommandFactory> delegates = Arrays.asList(
        new TrainCommandFactory()
        // others
    };
    public boolean canCreate(String t) {
        return delegates.stream()
            .filter(cf -> cf.canCreate(t))
            .findAny().isPresent();
    }
    public Command fromString(String c) {
        return delegates.stream()
            .filter(cf -> cf.canCreate(t))
            .findAny()
            .map(CommandFactory::fromString);
    }
}

关于java - 处理控制台命令的最佳 Java 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47812112/

相关文章:

java - 具有带注释的 servlet 模式的嵌入式 Jetty?

java - 在已编译的 Java 类中重写方法调用

java - 使 TestNG @Factory 测试用例按照提供的相同顺序运行

javascript - 从模块加载特定方法。设计模式

Java:如何检测(和更改?)System.console 的编码?

java - 如何部署到Intellij IDEA Tomcat文件夹?

design-patterns - 需要对模式进行一些说明(DAO x 网关)

java - 重新设计两个类以避免代码重复

javascript - 直接访问属性显示的值与对象控制台输出不同

linux - 查找并删除多个文件中的一行