解释器模式 (Interpreter)
📖 通俗理解
想象一个计算器:
- 输入:
3 + 5 * 2 - 输出:
13
计算器需要"理解"这个表达式,知道 + 是加法,* 是乘法,还要知道先乘后加。
解释器模式就是:定义一种语言的语法,并实现一个解释器来解释该语言的句子。
🎯 解决什么问题?
当有一种简单的语言需要解释执行时,可以用解释器模式。
适合场景:
- 表达式计算
- 正则表达式
- SQL 解析
- 模板引擎
🌰 生活中的例子
- 计算器:解释数学表达式
- 翻译软件:解释不同语言
- 编译器:解释编程语言
💻 Java 代码实现
场景:简单数学表达式计算
/**
* 抽象表达式
*/
public interface Expression {
int interpret();
}
/**
* 终结符表达式:数字
*/
public class NumberExpression implements Expression {
private int number;
public NumberExpression(int number) {
this.number = number;
}
@Override
public int interpret() {
return number;
}
}
/**
* 非终结符表达式:加法
*/
public class AddExpression implements Expression {
private Expression left;
private Expression right;
public AddExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret() {
return left.interpret() + right.interpret();
}
}
/**
* 非终结符表达式:减法
*/
public class SubtractExpression implements Expression {
private Expression left;
private Expression right;
public SubtractExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret() {
return left.interpret() - right.interpret();
}
}
/**
* 解析器
*/
public class Calculator {
public int calculate(String expression) {
Stack<Expression> stack = new Stack<>();
String[] tokens = expression.split(" ");
for (int i = 0; i < tokens.length; i++) {
String token = tokens[i];
if (token.equals("+")) {
Expression left = stack.pop();
Expression right = new NumberExpression(Integer.parseInt(tokens[++i]));
stack.push(new AddExpression(left, right));
} else if (token.equals("-")) {
Expression left = stack.pop();
Expression right = new NumberExpression(Integer.parseInt(tokens[++i]));
stack.push(new SubtractExpression(left, right));
} else {
stack.push(new NumberExpression(Integer.parseInt(token)));
}
}
return stack.pop().interpret();
}
}
使用:
public class Client {
public static void main(String[] args) {
Calculator calculator = new Calculator();
System.out.println("10 + 5 = " + calculator.calculate("10 + 5"));
System.out.println("20 - 8 = " + calculator.calculate("20 - 8"));
System.out.println("10 + 5 - 3 = " + calculator.calculate("10 + 5 - 3"));
}
}
输出:
10 + 5 = 15
20 - 8 = 12
10 + 5 - 3 = 12
⚠️ 注意事项
解释器模式比较少用,因为:
- 复杂语法难以维护
- 执行效率不高
- 可以用现有的解析工具替代(如 ANTLR)
✅ 适用场景
- 语法简单且稳定
- 执行效率不是关键
- 可以方便地用语法树表示
小结
解释器模式:定义语法规则,解释执行语言。
应用:正则表达式、Spring EL 表达式、SQL 解析
👉 下一篇:迭代器模式
