解释器模式是 23 种里最冷门的一个:为一种语言/文法定义解释器,解析并执行表达式。正则引擎、计算器就是它的思想来源。这篇简单介绍它是什么、以及为什么实际很少手写。
一、解决什么问题:解析和执行一种"语言"
有些场景需要解析一种特定的表达式/语法,比如计算 1 + 2 * 3、匹配正则、解析配置文件格式。
解释器模式:把语法规则拆成一个个"表达式类",每个类负责解释一部分语法,组合起来解析整句。
二、核心结构(简单计算器)
java
// 抽象表达式:每个表达式都能"解释"出一个结果
interface Expression {
int interpret();
}
// 终结符表达式:数字
class NumberExpression implements Expression {
private int number;
NumberExpression(int n) { this.number = n; }
public int interpret() { return number; }
}
// 非终结符表达式:加法(组合两个子表达式)
class AddExpression implements Expression {
private Expression left, right;
AddExpression(Expression l, Expression r) { left = l; right = r; }
public int interpret() { return left.interpret() + right.interpret(); }
}
// 使用:1 + 2 = 3
Expression expr = new AddExpression(new NumberExpression(1), new NumberExpression(2));
expr.interpret(); // 3关键:每个语法规则是一个类(数字、加法、减法……),用"组合"的方式拼出整句表达式,递归解释。
三、为什么实际很少手写
解释器模式有个致命缺点:语法规则一多,类就爆炸(每个规则一个类),且手写的解释器性能差、难维护。
所以实际中,解析表达式/语法基本都用现成的工具:
- 正则表达式:
Pattern/Matcher,Java 内置的解释器 - 表达式计算:SpEL(Spring 表达式)、Aviator、QLExpress 等现成引擎
- 配置文件解析:用 JSON/YAML 库,而不是手写解释器
四、实际应用
解释器模式本身很少手写,但它的思想到处都是:正则引擎、SQL 解析、SpEL、模板引擎(Thymeleaf 解析模板表达式)。
小结
- 解释器为语法规则定义"表达式类",组合起来解析执行
- 缺点:规则多则类爆炸,实际很少手写
- 思想落地:正则、SpEL、模板引擎都是现成的"解释器"
相关:23 种里最冷门,实际用现成引擎即可,了解思想就够。
