解释器模式

本文最后更新于 2025年7月28日 晚上

解释器模式提供了评估语言的语法或表达式的方式

角色

  1. 抽象表达式(Expression) :定义解释操作的接口,是终结符与非终结符表达式的父类。
  2. 终结符表达式(TerminalExpression) :实现表达式接口,用于表示语法中的基本元素,如数字、变量等。
  3. 非终结符表达式(NonTerminalExpression) :组合多个表达式,对应文法中的组合规则,如加减法、布尔表达式等。
  4. (可选)上下文类(Context) :用于存储变量、函数等符号与值的映射关系。本例中简化未使用。
  5. 客户端(Client) :构建表达式并触发解释操作。

优点

扩展性强

缺点

  1. 引起类的膨胀,需要创建大量的类
  2. 效率问题,主要采用递归的调用方法

实现解释器模式

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// 定义操作接口
public abstract class Expression{
public abstract int interpret();
}

// 定义数值处理实现类
public class ValueExpression extends Expression{
private int value ;
public ValueExpression(){}

public ValueExpression(int value){
this.value = value ;
}
public int getValue(){
return value ;
}
public void setValue(int value){
this.value = value ;
}
@Override
public int interpret(){
return this.value ;
}

}
// 定义符号处理实现类
public class SymbolExpression extends Expression{
protected Expression left ;
protected Expression right ;

public SymbolExpression(Expression left , Expression right){
this.left = left ;
this.right = right ;
}
@Override
public int interpret(){
return 0 ;
}
}

// 定义加法表达式
public class AddExpression extends SymbolExpression{
public AddExpression(Expression left , Expression right){
super(left , right);
}

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

// 定义减法表达式
public class SubExpression extends SymbolExpression{
public SubExpression(Expression left , Expression right){
super(left,right);
}

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

// 定义一个Calculator 执行运算步骤
public class Calculator{
public int calculate(String statement){
String[] strs = statement.split(" ");

Expression left = new ValueExpression(Integer.valueOf(strs[0]));
Expression right = new ValueExpression(Integer.valueOf(strs[2]));

String symbol = strs[1];
Expression symbolExpression = null ;
if("+".equals(symbol)){
symbolExpression = new AddExpression(left , right);
} else if ("-".equals(symbol)){
symbolExpression = new SubExpression(left , right);
}
return symbolExpression.interpret();
}
}
// 调用
public class Client {
public static void main(String[] args){
String statement = "1+2";
Calculator calculator = new Calculator();
int rs = calculator.calculate(statement);
System.out.println(statement+"=" + rs );

statement = "5-3";
rs = calculator.calculate(statement);
System.out.println(statement+"=" + rs );
}
}

总结

解释器模式(Interpreter Pattern)用于构建一个解释器,对给定语言中的语句或表达式进行求值。它定义了一个语言的文法规则,并用类来表示文法中的各个规则,最终通过组合这些规则来解析表达式。解释器模式适用于语言规则较简单、语法稳定的场景,比如计算器、脚本语言、正则表达式等。


解释器模式
http://gadoid.io/2025/07/28/解释器模式/
作者
Codfish
发布于
2025年7月28日
许可协议