java - 是否以及如何使用复合模式(GoF)

标签 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> }

命令的行为由命令模式管理,这是可以的。

我想以最简单的方式使用复合模式来构建通用命令的结构,但我发现这是一项艰巨的任务。有什么建议吗?

只有解释器模式才是执行此操作的不错选择吗?还是两者的结合?

一旦我有了复合结构,我就想使用构建器(可能是递归构建器)来创建命令。

谢谢。

最佳答案

复合是表示树结构的一个很好的模式,但我认为这不太适合您在这里所做的事情。您的命令没有深度嵌套,并且没有递归嵌套,因此您可能不会从这种结构中获得太多好处。

您的命令是结构化的,以便第一个标记确定操作,并且有特定于命令的规则来解析字符串的其余部分。命令模式看起来很理想,我建议使用工厂模式来封装具体的实现:

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/

相关文章:

java - 如何在我的 JSP 中对可调用语句/准备过程的输出进行分页?

java - 如果我的 android 项目依赖于具有其他依赖项的 .jar,我是否必须将这些依赖项包含在我的项目中?

java - 无法通过 Smack API 使用 openfire 服务器发送/接收消息

design-patterns - 如何打破 Grails 域类之间的硬依赖

c# - 抽象工厂模式和属性

c# - 依赖注入(inject)模式下设计的基本原则是什么

java - 动态 TestNG XML 创建。获取错误的 XML。我哪里错了

python - 为什么人们说python很慢是因为它被解释了?它有 .pyc 文件

c++ - 模拟 Web 浏览器以包装多个类似网站的功能

python - 如何使用Python的PID查看Python正在读取或编辑哪些文件?