MST

星途 面试题库

面试题:Java解释器模式在实际项目中的应用场景及实现

假设你正在开发一个简单的数学表达式解析器(支持加、减、乘、除),请使用Java解释器模式进行设计与实现,描述你的设计思路,并给出关键代码片段。
28.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 抽象表达式类:定义一个抽象类 Expression,包含一个抽象方法 interpret,用于解释表达式。
  2. 终结符表达式类:创建 NumberExpression 类继承自 Expression,表示数字,interpret 方法返回该数字。
  3. 非终结符表达式类:分别创建 AddExpressionSubtractExpressionMultiplyExpressionDivideExpression 类继承自 Expression,这些类包含两个 Expression 实例变量,interpret 方法根据相应的运算规则调用子表达式的 interpret 方法并返回结果。
  4. 客户端:在客户端代码中,构建表达式树,并调用根表达式的 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);
    }
}