设计模式 - 解释器模式
解释器模式(Interpreter Pattern)就是将语言规则通过面向对象的方式建模,让每个语法元素变成一个可组合的对象,通过解释这 些对象来实现语言的执行。如果你有一个自定义 DSL(领域特定语言)要解析,那解释器模式将会非常适合你!
解释器模式适用于这样一种情况:
你想为某种语言创建一个解释器。语言的语法可以用类表示,每个类代表语法中的一种规则,最终通过组合类来解释和执行语句。
实际上,如果你曾经写过一个“计算器”或者“公式解析器”,那你已经接触过解释器模式的思想了。
核心思想 🌟
为某种语言或表达式定义一种解释器,用代码实现这种语言的语法规则,并通过对象结构来解释该语言中的句子。
- 每个语法规则用一个类来表示,实现一个统一的
interpret()
方法。 - 通过组合这些规则,构建出更复杂的表达式结构。
- 执行时,递归调用各个表达式的
interpret()
方法来计算结果。
模式结构(UML 类图)
+--------------------+
| AbstractExpression |
+--------------------+
| + interpret() |
+--------------------+
▲ ▲
+-----------+ +-------------+
| Terminal | | NonTerminal |
|Expression | | Expression |
+-----------+ +-------------+
Client --→ 通过组合多个 Expression 构建语法树
示例:简单布尔表达式解释器
假设你想做一个简单的逻辑表达式解析器,比如:
true AND false
true OR false
你希望用代码来表示这些规则,并根据输入来“解释”出结果。这正是解释器模式要做的事情。
Java 实现
interface Expression {
boolean interpret();
}
class TrueExpression implements Expression {
public boolean interpret() {
return true;
}
}
class FalseExpression implements Expression {
public boolean interpret() {
return false;
}
}
class AndExpression implements Expression {
private Expression left, right;
public AndExpression(Expression l, Expression r) {
this.left = l;
this.right = r;
}
public boolean interpret() {
return left.interpret() && right.interpret();
}
}
class OrExpression implements Expression {
private Expression left, right;
public OrExpression(Expression l, Expression r) {
this.left = l;
this.right = r;
}
public boolean interpret() {
return left.interpret() || right.interpret();
}
}
public class Main {
public static void main(String[] args) {
Expression expr = new AndExpression(
new TrueExpression(),
new FalseExpression()
);
System.out.println(expr.interpret()); // false
Expression expr2 = new OrExpression(
new TrueExpression(),
new FalseExpression()
);
System.out.println(expr2.interpret()); // true
}
}