我正在尝试创建一个控制台来处理来自字符串
的控制台命令。
目前我正在使用 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");
}
但我认为这不是最好的解决方案。
我想知道是否已经有一个好的设计模式来解决这样的问题?
我已经研究了 builder
和 factory
模式,但无法真正确定它们是否是正确的选择。
最佳答案
也许是一个命令
和工厂
模式?
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/