Skip to main content

解释器模式 (Interpreter)

场景问题​

问题案例​

考虑一个简单的数学表达式求值系统,如“1+2+3”,需要支持表达式的解析和计算。

不用模式的解决方案​

实现简化版本​

最直接的做法是用字符串分割和循环实现:

public class SimpleCalculator {
public int calculate(String expr) {
String[] parts = expr.split("\\+");
int sum = 0;
for (String part : parts) {
sum += Integer.parseInt(part.trim());
}
return sum;
}
}

使用示例​

SimpleCalculator calc = new SimpleCalculator();
System.out.println(calc.calculate("1+2+3"));

有何问题​

  1. 只能处理非常简单的表达式。
  2. 扩展新语法(如减法、括号)非常困难。
  3. 代码可读性和可维护性差。

解决方案​

解释器模式的定义​

给定一种语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

应用解释器模式的思路​

  • 定义抽象表达式接口,具体表达式实现解释逻辑。
  • 通过组合表达式对象构建语法树。
  • 解释器递归解释语法树。

解释器模式的结构​

  • Expression:抽象表达式,定义解释操作。
  • TerminalExpression:终结符表达式,实现基本解释。
  • NonTerminalExpression:非终结符表达式,组合表达式。

解释器模式的实现​

// 抽象表达式
public interface Expression {
int interpret();
}

// 终结符表达式:数字
public class NumberExpression implements Expression {
private int number;
public NumberExpression(int number) { this.number = number; }
public int interpret() { return number; }
}

// 非终结符表达式:加法
public class AddExpression implements Expression {
private Expression left, right;
public AddExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
public int interpret() { return left.interpret() + right.interpret(); }
}

// 解析器(简单实现,仅支持加法)
public class Parser {
public static Expression parse(String expr) {
String[] parts = expr.split("\\+");
Expression result = new NumberExpression(Integer.parseInt(parts[0].trim()));
for (int i = 1; i < parts.length; i++) {
result = new AddExpression(result, new NumberExpression(Integer.parseInt(parts[i].trim())));
}
return result;
}
}

使用示例​

public class Client {
public static void main(String[] args) {
Expression expr = Parser.parse("1+2+3");
System.out.println(expr.interpret()); // 输出6
}
}

解释器重写示例​

示例结构​


示例代码​

见上文“解释器模式的实现”部分。


模式讲解​

解释器模式的功能​

  • 便于扩展新的语法和操作。
  • 适用于语法规则简单、可组合的场景。
  • 结构清晰,易于维护。

实现成接口​

  • 表达式通常定义为接口或抽象类。

使用工厂方法​

  • 可结合工厂方法模式,统一创建表达式对象。

切换产品簇​

  • 可用于切换不同的语法实现,如加法、减法、乘法等。

执行时序图​