Featured image of post Java设计模式-解释器模式Interpreter

Java设计模式-解释器模式Interpreter

相关文章

【合集】Java设计模式

总结

思维:逐个节点的进行读取解析运算

角色

抽象表达式

终结符表达式

非终结符表达式

环境角色

客户端

优缺点

优点:易于扩展、实现文法较为容易

缺点:对于复杂文法难以维护、执行效率较低

使用场景

当语言的文法较为简单,且执行效率不是关键问题时。

当问题重复出现,且可以用一种简单的语言来进行表达时。

当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树的时候。

解释器模式

环境角色类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public static class Context {
    // 变量 值 map
    private final Map<Variable, Integer> map = new HashMap<>();
    public void assign(Variable var, Integer value) {
        map.put(var, value);
    }
    public int getValue(Variable var) {
        return map.get(var);
    }
}

抽象表达式

1
2
3
public static abstract class AbstractExpression {
    public abstract int interpret(Context context);
}

终结符表达式:变量表达式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@AllArgsConstructor
public static class Variable extends AbstractExpression {
    private String name;
    public int interpret(Context context) {
        return context.getValue(this);
    }
    @Override
    public String toString() {
        return name;
    }
}

非终结表达式:加法表达式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
@AllArgsConstructor
public static class Plus extends AbstractExpression {
    // +号左边的表达式
    private AbstractExpression left;
    // +号右边的表达式
    private AbstractExpression right;
    @Override
    public int interpret(Context context) {
        // 将左边表达式的结果和右边表达式的结果进行相加
        return left.interpret(context) + right.interpret(context);
    }
    @Override
    public String toString() {
        return "(" + left.toString() + " + " + right.toString() + ")";
    }
}

非终结表达式:减法表达式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
@AllArgsConstructor
public static class Minus extends AbstractExpression {
    // -号左边的表达式
    private AbstractExpression left;
    // -号右边的表达式
    private AbstractExpression right;
    @Override
    public int interpret(Context context) {
        // 将左边表达式的结果和右边表达式的结果进行相减
        return left.interpret(context) - right.interpret(context);
    }
    @Override
    public String toString() {
        return "(" + left.toString() + " - " + right.toString() + ")";
    }
}

客户端调用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Context context = new Context();
Variable a = new Variable("a");
Variable b = new Variable("b");
Variable c = new Variable("c");
Variable d = new Variable("d");

context.assign(a, 1);
context.assign(b, 2);
context.assign(c, 3);
context.assign(d, 4);

// 获取抽象语法树 a + b - c + d
AbstractExpression expression = new Plus(a, new Minus(new Minus(b, c), d));

//  解释(计算)
int result = expression.interpret(context);
System.out.println(expression + " = " + result);

输出

1
(a + ((b - c) - d)) = -4
皖ICP备2024056275号-1
发表了78篇文章 · 总计149.56k字
本站已稳定运行