解释器模式
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)
- 模板引擎的语法解析
- 计算器应用
使用频率较低,当语法简单且固定时才值得使用。复杂语法建议用专业的解析器生成工具。