我应该在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> }
命令&#39;行为由Command模式管理,没关系。
我想以最简单的方式将Composite模式用于一般命令的结构,但我发现这是一项艰巨的任务。有什么建议吗?
只有解释器模式才是这样做的好选择吗?或两者兼而有之?
一旦我有了Composite结构,我就想用它来构建一个Builder(可能是一个Recursive Builder)来创建命令。
谢谢。
答案 0 :(得分:0)
复合材料是表示树状结构的一种很好的模式,但我不认为它非常适合你在这里所做的事情。你的命令没有深度嵌套,并且没有递归嵌套,所以你可能不会从这个结构中获得太多好处。
您的命令的结构使第一个标记确定了操作,并且存在用于解析字符串其余部分的特定于命令的规则。命令模式看起来很理想,我建议使用工厂模式来封装特定的实现:
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
}