文章目录
- 前言
- 一、概念
- 二、核心结构
- [三、Java 代码实现(加减运算解释器)](#三、Java 代码实现(加减运算解释器))
-
- [1. 抽象表达式](#1. 抽象表达式)
- [2. 终结符:数字](#2. 终结符:数字)
- [3. 非终结符:加法](#3. 非终结符:加法)
- [4. 非终结符:减法](#4. 非终结符:减法)
- [5. 客户端(构建语法树并解释)](#5. 客户端(构建语法树并解释))
- 四、优缺点
- 五、应用场景
- 六、总结
前言
如果某个特定类型的问题频繁发生 ,且可以用简单语法、规则表达式 来表达,我们就可以构建一个解释器,让它解释这些"语法句子",从而解决问题。比如:SQL 解析、正则表达式、规则引擎、公式计算、DSL 等。解释器模式 就是为自定义语言、规则、表达式提供解释执行能力的行为型设计模式。
一、概念
解释器模式(Interpreter Pattern) 是一种行为型设计模式 ,核心思想:
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
简单理解:
- 把语法规则 拆成一个个表达式;
- 每个表达式负责解释自己;
- 组合起来就能解释一整句话。
一句话总结:
自定义语法 → 拆成表达式 → 逐个解释。
二、核心结构
- AbstractExpression(抽象表达式)
定义解释接口interpret()。 - TerminalExpression(终结符表达式)
最小单元,不能再拆(如数字、变量)。 - NonTerminalExpression(非终结符表达式)
组合多个表达式(如 + - * / 逻辑运算)。 - Context(上下文)
全局信息、变量、环境数据。 - Client
构建语法树,调用解释。
三、Java 代码实现(加减运算解释器)
实现一个最简单的:数字 + 加法 + 减法 解释器。
1. 抽象表达式
java
public interface Expression {
int interpret();
}
2. 终结符:数字
java
// 终结表达式:数字
public class NumberExpression implements Expression {
private int number;
public NumberExpression(int number) {
this.number = number;
}
@Override
public int interpret() {
return number;
}
}
3. 非终结符:加法
java
// 非终结:加法
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();
}
}
4. 非终结符:减法
java
// 非终结:减法
public class SubExpression implements Expression {
private Expression left;
private Expression right;
public SubExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret() {
return left.interpret() - right.interpret();
}
}
5. 客户端(构建语法树并解释)
解释:10 + 5 - 3
java
public class Client {
public static void main(String[] args) {
// 10 + 5 - 3
Expression num10 = new NumberExpression(10);
Expression num5 = new NumberExpression(5);
Expression num3 = new NumberExpression(3);
// 10+5
Expression add = new AddExpression(num10, num5);
// (10+5)-3
Expression sub = new SubExpression(add, num3);
System.out.println("结果:" + sub.interpret());
}
}
输出:
结果:12
四、优缺点
优点
- 语法由类表示,易扩展、易修改规则
- 易于实现简单 DSL / 规则引擎
- 符合开闭原则:新增表达式只需加类
缺点
- 复杂文法会造成类爆炸
- 效率低,不适合复杂语法
- 调试困难
五、应用场景
- 正则表达式引擎
- SQL 解析器
- 规则引擎(简单规则)
- 公式计算(Excel 表达式)
- 配置文件解析
- 自定义 DSL 脚本
经典应用:
- Java 正则
Pattern/Matcher - Spring EL 表达式
- MyBatis OGNL
- Aviator 表达式引擎
六、总结
- 解释器模式 = 自定义语法 + 表达式拆分 + 递归解释
- 核心:每个规则对应一个表达式类
- 结构:抽象表达式 + 终结/非终结表达式 + 上下文
- 适合简单语法、规则频繁变化的场景
- 复杂语法请用专业工具(ANTLR、JavaCC),不要手写解释器