如果以及如何使用复合模式(GoF' s)

时间:2015-07-10 14:48:01

标签: java design-patterns interpreter composite ebnf

我应该在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)来创建命令。

谢谢。

1 个答案:

答案 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
}