解释器模式 (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"));
有何问题
- 只能处理非常简单的表达式。
- 扩展新语法(如减法、括号)非常困难。
- 代码可读性和可维护性差。
解决方案
解释器模式的定义
给定一种语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
应用解释器模式的思路
- 定义抽象表达式接口,具体表达式实现解释逻辑。
- 通过组合表达式对象构建语法树。
- 解释器递归解释语法树。
解释器模式的结构
- 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
}
}
解释器重写示例
示例结构
示例代码
见上文“解释器模式的实现”部分。
模式讲解
解释器模式的功能
- 便于扩展新的语法和操作。
- 适用于语法规则简单、可组合的场景。
- 结构清晰,易于维护。
实现成接口
- 表达式通常定义为接口或抽象类。
使用工厂方法
- 可结合工厂方法模式,统一创建表达式对象。
切换产品簇
- 可用于切换不同的语法实现,如加法、减法、乘法等。