我应该用 Java 创建一个迷你命令解释器 (System.in),以支持使用适当的 GoF 模式对图形对象进行操作。解释器的语法是一种简单的 EBNF 语言,如下所示: `
<cmd>::=<create>|<remove>|<move>|<scale>|<list>|<group>|<ungroup>|<area>|<perimeter>
<create>::= new <typeconstr> <pos>
<remove>::= del <objID>
<move>::= mv <objID> <pos> | mvoff <objID> <pos>
<scale>::= scale <objID> <posfloat>
<list>::= ls <objID>| ls <type> | ls all | ls groups
<group>::= grp <listID>
<ungroup>::= ungrp <objID>
<area>::= area <objID>| area <type> | area all
<perimeter>::= perimeter <objID>| perimeter <type> | perimeter all
<pos>::=( <posfloat> , <posfloat> )
<typeconstr>::= circle (<posfloat>) | rectangle <pos> | img (<path>)
<type>::= circle | rectangle | img
<listID>::= <objID> { , <objID> }
命令的行为由命令模式管理,这是可以的。
我想以最简单的方式使用复合模式来构建通用命令的结构,但我发现这是一项艰巨的任务。有什么建议吗?
只有解释器模式才是执行此操作的不错选择吗?还是两者的结合?
一旦我有了复合结构,我就想使用构建器(可能是递归构建器)来创建命令。
谢谢。
最佳答案
复合是表示树结构的一个很好的模式,但我认为这不太适合您在这里所做的事情。您的命令没有深度嵌套,并且没有递归嵌套,因此您可能不会从这种结构中获得太多好处。
您的命令是结构化的,以便第一个标记确定操作,并且有特定于命令的规则来解析字符串的其余部分。命令模式看起来很理想,我建议使用工厂模式来封装具体的实现:
public class MyCommand{
public static MyCommand getInstance(String str){
String commandType = // get first token
String args = // remainder of string
switch (commandType){
case "new":
return buildCreateCommand(args);
// ... other cases
}
}
private MyCreateCommand buildCreateCommand(String args){
// Construct create command from args
}
}
class MyCreateCommand extends MyCommand{
// Create command things
}
关于java - 是否以及如何使用复合模式(GoF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31343798/