解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一个语言的文法表示,并定义一个解释器用来处理该语言中的句子。这种模式常用于解析表达式或特定领域语言(DSL, Domain-Specific Language),比如数学表达式、正则表达式、SQL语句等。
体现的设计原则
- 单一职责原则:每个解释器类只负责解释一种语法结构,从而简化了每个类的职责。
- 开闭原则:可以在不修改现有代码的情况下扩展系统的功能,通过添加新的解释器类来实现新语法结构的支持。
- 封装变化:将文法规则的变化封装在解释器类中,使得客户端代码不受影响。
示例场景
假设我们需要构建一个简单的计算器,能够解析和计算基于加减法的表达式,例如 3 + 4 - 2
。我们可以使用解释器模式来实现这个功能。
Java 代码示例
java
// 抽象表达式接口
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;
private Expression right;
public AddExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret() {
return left.interpret() + right.interpret();
}
}
// 非终结符表达式 - 减法
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();
}
}
// 上下文类 - 表达式解析器
class ExpressionParser {
public static Expression parse(String expression) {
String[] tokens = expression.split(" ");
Expression result = new NumberExpression(Integer.parseInt(tokens[0]));
for (int i = 1; i < tokens.length; i += 2) {
String operator = tokens[i];
int number = Integer.parseInt(tokens[i + 1]);
if (operator.equals("+")) {
result = new AddExpression(result, new NumberExpression(number));
} else if (operator.equals("-")) {
result = new SubtractExpression(result, new NumberExpression(number));
}
}
return result;
}
}
// 客户端代码
public class InterpreterPatternDemo {
public static void main(String[] args) {
String input = "3 + 4 - 2";
Expression expression = ExpressionParser.parse(input);
System.out.println(input + " = " + expression.interpret());
}
}
在这个例子中:
Expression
是抽象表达式接口,定义了所有具体表达式共有的方法interpret
。NumberExpression
是终结符表达式类,表示数字。AddExpression
和SubtractExpression
是非终结符表达式类,分别表示加法和减法操作。ExpressionParser
是上下文类,负责解析输入字符串并生成相应的表达式对象。- 在客户端代码中,使用
ExpressionParser
来解析输入表达式,并调用interpret
方法计算结果。
这样,我们可以通过解释器模式来实现对特定语言或表达式的解析和解释,从而支持复杂的计算和逻辑操作。