设计思路
- 抽象表达式类:定义一个抽象类
Expression
,包含一个抽象方法 interpret
,用于解释表达式。
- 终结符表达式类:创建
NumberExpression
类继承自 Expression
,表示数字,interpret
方法返回该数字。
- 非终结符表达式类:分别创建
AddExpression
、SubtractExpression
、MultiplyExpression
、DivideExpression
类继承自 Expression
,这些类包含两个 Expression
实例变量,interpret
方法根据相应的运算规则调用子表达式的 interpret
方法并返回结果。
- 客户端:在客户端代码中,构建表达式树,并调用根表达式的
interpret
方法得到最终结果。
关键代码片段
// 抽象表达式类
abstract class Expression {
public abstract int interpret();
}
// 终结符表达式类 - 数字
class NumberExpression extends Expression {
private int number;
public NumberExpression(int number) {
this.number = number;
}
@Override
public int interpret() {
return number;
}
}
// 非终结符表达式类 - 加法
class AddExpression extends 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 extends 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 MultiplyExpression extends Expression {
private Expression left;
private Expression right;
public MultiplyExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret() {
return left.interpret() * right.interpret();
}
}
// 非终结符表达式类 - 除法
class DivideExpression extends Expression {
private Expression left;
private Expression right;
public DivideExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret() {
return left.interpret() / right.interpret();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Expression expression = new AddExpression(
new MultiplyExpression(new NumberExpression(2), new NumberExpression(3)),
new SubtractExpression(new NumberExpression(5), new NumberExpression(1))
);
int result = expression.interpret();
System.out.println("结果: " + result);
}
}