设计模式之解释器模式

设计模式之备忘录模式

模式定义

解释器模式(Interpreter Pattern)是行为型设计模式之一,用于定义一个语言的文法,并创建解释器来解释该语言中的句子。它适用于某些特定领域的语言解析,如数学表达式、正则表达式、SQL解析等。

角色与结构

解释器模式通常由以下几个核心角色组成:

1️⃣ 抽象表达式(Abstract Expression)

  • 定义解释器的接口,所有的解释器都需要实现这个接口。

2️⃣ 终结符表达式(Terminal Expression)

  • 具体实现解析的基本单元,比如解析数字、变量等。

3️⃣ 非终结符表达式(Non-Terminal Expression)

  • 组合多个终结表达式,构成复杂的解析逻辑,如加法、乘法等运算。

4️⃣ 上下文(Context)

  • 存储和管理全局信息,比如变量的值、运算环境等。

5️⃣ 客户端(Client)

  • 构造抽象语法树(AST),并调用解释器解析表达式。

适用场景

  • 编译器、解释器(如SQL解析器、数学公式解析器)
  • 正则表达式解析(如Pattern.compile(“a*b”))
  • 命令脚本解析(如计算器应用、命令模式)
  • 语法树解析(如XML/JSON解析器)

代码示例(Java实现)

示例:实现一个简单的数学表达式解释器(支持加法和乘法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// 抽象表达式接口
interface Expression {
int interpret();
}

// 终结符表达式(数字)
class NumberExpression implements Expression {
private int number;

public NumberExpression(int number) {
this.number = number;
}

@Override
public int interpret() {
return number;
}
}

// 非终结符表达式(加法)
class AddExpression implements Expression {
private Expression left, right;

public AddExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}

@Override
public int interpret() {
return left.interpret() + right.interpret();
}
}

// 非终结符表达式(乘法)
class MultiplyExpression implements Expression {
private Expression left, right;

public MultiplyExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}

@Override
public int interpret() {
return left.interpret() * right.interpret();
}
}

// 客户端
public class InterpreterPatternDemo {
public static void main(String[] args) {
// 构造表达式: (3 + 5) * 2
Expression three = new NumberExpression(3);
Expression five = new NumberExpression(5);
Expression add = new AddExpression(three, five); // 3 + 5
Expression two = new NumberExpression(2);
Expression multiply = new MultiplyExpression(add, two); // (3 + 5) * 2

// 解释表达式并计算结果
System.out.println("计算结果: " + multiply.interpret()); // 输出 16
}
}
1
计算结果:16

解释器模式的优缺点

优点:

​ •可扩展性强:支持扩展新的语法规则(新增表达式类)。

​ •符合 OCP(开放封闭原则):修改语法不会影响已有的代码。

​ •代码结构清晰:符合语言的文法结构,易于理解。

缺点:

​ •效率低:对于复杂语法来说,构建 AST 可能会导致性能下降。

​ •代码复杂度高:需要定义大量的类来表示不同的语法规则。

​ •不适用于复杂的语法:一般适用于简单语言,复杂解析通常使用编译原理技术(如 ANTLR、Lex/Yacc)。

总结

1️⃣ 解释器模式用于解析和执行语言表达式,适用于领域特定语言(DSL)。

2️⃣ 适用于简单的语法解析,但对于复杂语言通常使用专门的解析工具。

3️⃣ 核心思想:构造 AST(抽象语法树),递归解析表达式。