java创建一个简单的字符串解析器,交互式外壳式
我想基于控制台创建一个简单的交互式shell,在这里我可以编写login
、help
等命令
我首先想到使用enum,但后来我不知道如何在没有if-else语句的情况下灵活地实现它们,因此我决定采用数组方法,并提出了以下建议:
public class Parser {
private static String[] opts = new String[] {"opt0", "opt1", "opt2", "opt3" ... }
public void parse(String text) {
for(int i = 0; i < opts.length; i++) {
if(text.matches(opts[i]) {
switch(i) {
case 0:
// Do something
case 1:
// Do something-something
case 2:
// Do something else
}
return;
}
}
}
}
但我最终发现,这可能是做类似事情最基本的方式,如果我想改变选项的顺序,就会出现问题。如何制作一个更简单的解析器?这样做是可行的,但也会带来问题。该程序的使用纯粹是教育性的,并非用于任何严肃的事情
# 1 楼答案
想到的一个解决方案是使用设计模式。您可以使用来自用户的输入作为Factory class的鉴别器
这个工厂类将根据输入生成一个带有“execute”方法的对象。这叫做Command object.
然后,您可以简单地调用从工厂返回的对象的方法
不需要switch语句。如果对象为null,那么您就知道用户输入了一个无效选项,并且它将决策逻辑从输入解析器中抽象出来
希望这会有所帮助:)
# 2 楼答案
一种简单的方法是使用一个
HashMap
,其键等于命令文本,值是处理该命令的类的实例。假设命令处理程序类不接受参数(但您可以轻松地扩展它),您可以只使用Runnable
实例示例代码:
通过实现自己的接口并将其子类化,可以轻松地扩展这种方法以接受参数。如果您知道数据类型,那么最好使用
variable arguments
,例如void execute(String ... args)