其他分享
首页 > 其他分享> > 设计模式之解释器模式

设计模式之解释器模式

作者:互联网

定义

定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。解释器模式是一种类行为型模式。

UML类图

在这里插入图片描述

代码实现

Context.java

public class Context {
    private ArrayDeque<String> map = new ArrayDeque<>();

    public void assign(String value) {
        map.offerLast(value);
    }

    public String lookup() {
        return map.pollFirst();
    }
}

AbstractExpression.java

public abstract class AbstractExpression {
    public abstract int interpret(Context context);
}

AddExpressiion.java

public class AddExpressiion extends AbstractExpression {

    private AbstractExpression left, right;

    public AddExpressiion(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(Context context) {
        return left.interpret(context)+right.interpret(context);
    }
}

ReduceExpressiion.java

public class ReduceExpressiion extends AbstractExpression {

    private AbstractExpression left, right;

    public ReduceExpressiion(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(Context context) {
        return left.interpret(context)-right.interpret(context);
    }
}

ContextHandler.java

public class ContextHandler {

    public void handle(String text) {
        Context context = new Context();
        String[] values = text.split("\\+|\\-");
        for (int i = 0; i < values.length; i++) {
            System.out.println("values:"+values[i]);
            context.assign(values[i].trim());
        }

        AbstractExpression left;
        AbstractExpression right;
        left = new TerminalExpression();
        right = new TerminalExpression();

        for (int i = 0; i < text.length(); i++) {
            char c = text.charAt(i);
            if (c == '+') {
                left = new AddExpressiion(left, right);
            } else if (c == '-') {
                left = new ReduceExpressiion(left, right);
            }
        }

        System.out.println("result:"+left.interpret(context));
    }
}

Main.java

new ContextHandler().handle("1+3+4-1");

打印结果:

result:7

优缺点

主要优点

  1. 易于改变和扩展文法。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。

  2. 每一条文法规则都可以表示为一个类,因此可以方便地实现一个简单的语言。

  3. 实现文法较为容易。在抽象语法树中每一个表达式节点类的实现方式都是相似的,这些类的代码编写都不会特别复杂,还可以通过一些工具自动生成节点类代码。

  4. 增加新的解释表达式较为方便。如果用户需要增加新的解释表达式只需要对应增加一个新的终结符表达式或非终结符表达式类,原有表达式类代码无须修改,符合“开闭原则”。

主要缺点

  1. 对于复杂文法难以维护。在解释器模式中,每一条规则至少需要定义一个类,因此如果一个语言包含太多文法规则,类的个数将会急剧增加,导致系统难以管理和维护,此时可以考虑使用语法分析程序等方式来取代解释器模式。

  2. 执行效率较低。由于在解释器模式中使用了大量的循环和递归调用,因此在解释较为复杂的句子时其速度很慢,而且代码的调试过程也比较麻烦。

标签:解释器,right,模式,interpret,context,设计模式,public,AbstractExpression,left
来源: https://blog.csdn.net/QQxiaoqiang1573/article/details/90106188