文章目录
Java 设计模式之解释器模式
概述
- 解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
- 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
UML

- AbstractExpression:表达式接口,定义解释行为。
- TerminalExpression:终结符表达式,直接返回一个值。
- NonterminalExpression:非终结符表达式,包含其他表达式并组合它们。
- Context:上下文环境类。
代码实现
定义解释器接口:
java
public interface Expression {
int interpret();
}
定义终端解释器类:
java
public class NumberExpression implements Expression {
private int number;
public NumberExpression(int number) {
this.number = number;
}
@Override
public int interpret() {
return number;
}
}
定义非终端解释器类:
java
// 加法表达式
public class AddExpression implements Expression {
private Expression leftExpression;
private Expression rightExpression;
public AddExpression(Expression leftExpression, Expression rightExpression) {
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
@Override
public int interpret() {
return leftExpression.interpret() + rightExpression.interpret();
}
}
java
// 减法表达式
public class SubtractExpression implements Expression {
private Expression leftExpression;
private Expression rightExpression;
public SubtractExpression(Expression leftExpression, Expression rightExpression) {
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
@Override
public int interpret() {
return leftExpression.interpret() - rightExpression.interpret();
}
}
使用:
java
public class Client {
public static void main(String[] args) {
NumberExpression numberExpression1 = new NumberExpression(1);
NumberExpression numberExpression2 = new NumberExpression(2);
NumberExpression numberExpression3 = new NumberExpression(5);
Expression addExpression = new AddExpression(numberExpression1, numberExpression2);
Expression subtractExpression = new SubtractExpression(addExpression, numberExpression3);
int result = subtractExpression.interpret();
System.out.println("result: " + result);
}
}
输出:
result: -2