My App

解释器模式

Interpreter — 定义一种语言的语法,并构建解释器来解释执行

一句话理解

给一种简单的语言/语法定义规则,然后写一个解释器来执行它。

解决什么问题

  • 需要解析和执行自定义的表达式或规则
  • 语法比较简单且固定,不值得用完整的编译器

怎么写

以"简单的数学表达式解释器"为例:

// 抽象表达式
public interface Expression {
    int interpret();
}

// 终结符表达式:数字
public class NumberExpression implements Expression {
    private final int number;
    public NumberExpression(int number) { this.number = number; }
    public int interpret() { return number; }
}

// 非终结符表达式:加法
public class AddExpression implements Expression {
    private final Expression left;
    private final Expression right;
    public AddExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
    public int interpret() {
        return left.interpret() + right.interpret();
    }
}

// 非终结符表达式:乘法
public class MultiplyExpression implements Expression {
    private final Expression left;
    private final Expression right;
    public MultiplyExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
    public int interpret() {
        return left.interpret() * right.interpret();
    }
}
// 表示:(3 + 2) * 4
Expression expr = new MultiplyExpression(
    new AddExpression(
        new NumberExpression(3),
        new NumberExpression(2)
    ),
    new NumberExpression(4)
);

System.out.println(expr.interpret());  // 20

使用场景

  • 正则表达式引擎
  • SQL 解析器
  • Spring 的 SpEL 表达式
  • 规则引擎(如 Drools)
  • 模板引擎的语法解析
  • 计算器应用

使用频率较低,当语法简单且固定时才值得使用。复杂语法建议用专业的解析器生成工具。

On this page