Java 中解释器模式,请用代码具体举例

解释器模式是一种行为设计模式,用于解释语言或表达式。它定义了一种语言的语法,并提供了解释器来解释该语言中的表达式。以下是一个简单的 Java 示例,演示了解释器模式的用法:

java 复制代码
import java.util.Map;
import java.util.Stack;
import java.util.HashMap;

// 抽象表达式类
interface Expression {
    int interpret(Map<String, Integer> context);
}

// 终结符表达式类
class Number implements Expression {
    private int number;

    public Number(int number) {
        this.number = number;
    }

    public int interpret(Map<String, Integer> context) {
        return number;
    }
}

// 非终结符表达式类 - 加法
class Plus implements Expression {
    private Expression leftOperand;
    private Expression rightOperand;

    public Plus(Expression left, Expression right) {
        leftOperand = left;
        rightOperand = right;
    }

    public int interpret(Map<String, Integer> context) {
        return leftOperand.interpret(context) + rightOperand.interpret(context);
    }
}

// 非终结符表达式类 - 减法
class Minus implements Expression {
    private Expression leftOperand;
    private Expression rightOperand;

    public Minus(Expression left, Expression right) {
        leftOperand = left;
        rightOperand = right;
    }

    public int interpret(Map<String, Integer> context) {
        return leftOperand.interpret(context) - rightOperand.interpret(context);
    }
}

// 上下文类
class Context {
    private Map<String, Integer> variables = new HashMap<>();

    public void setVariable(String name, int value) {
        variables.put(name, value);
    }

    public int getVariable(String name) {
        return variables.get(name);
    }
}

// 客户端类
public class Main {
    public static void main(String[] args) {
        String expression = "a + b - c";
        Context context = new Context();
        context.setVariable("a", 10);
        context.setVariable("b", 5);
        context.setVariable("c", 2);

        Expression parsedExpression = parse(expression);
        int result = parsedExpression.interpret(context);
        System.out.println("Result: " + result); // Output: Result: 13
    }

    public static Expression parse(String expression) {
        Stack<Expression> stack = new Stack<>();

        for (String token : expression.split("\\s")) {
            if (token.equals("+")) {
                Expression right = stack.pop();
                Expression left = stack.pop();
                stack.push(new Plus(left, right));
            } else if (token.equals("-")) {
                Expression right = stack.pop();
                Expression left = stack.pop();
                stack.push(new Minus(left, right));
            } else {
                stack.push(new Number(Integer.parseInt(token)));
            }
        }

        return stack.pop();
    }
}

在这个示例中,我们首先定义了抽象表达式接口 Expression,它有一个 interpret 方法用于解释表达式。然后我们定义了终结符表达式类 Number 用于表示数字,以及非终结符表达式类 Plus 和 Minus 分别用于表示加法和减法操作。

Context 类表示解释器的上下文,包含了变量的值。Main 类作为客户端,定义了一个表达式字符串,并解析该表达式并进行求值。

解析过程在 parse 方法中进行,我们使用栈来构建表达式的语法树,遇到操作符时,弹出栈顶的两个表达式,并根据操作符构建相应的表达式节点,然后将新的表达式节点压入栈中。

最后,通过调用解释器的 interpret 方法,我们可以传入上下文对象来求解表达式的值。

相关推荐
MediaTea几秒前
Python:实例 __dict__ 详解
java·linux·前端·数据库·python
SunnyDays10112 分钟前
Python Excel 打印设置全攻略(打印区域、缩放、页边距、页眉页脚等)
python·excel打印设置·excel页面设置·excel打印选项
小鸡吃米…4 分钟前
Python的人工智能-机器学习
人工智能·python·机器学习
傻啦嘿哟15 分钟前
Python上下文管理器:优雅处理资源释放的魔法工具
开发语言·python
阿方索16 分钟前
Python 基础简介
开发语言·python
个案命题18 分钟前
鸿蒙ArkUI组件通信专家:@Param装饰器的奇幻漂流
java·服务器·前端
CodeCraft Studio25 分钟前
Excel处理控件Aspose.Cells教程:使用C#在Excel中创建折线图
java·c#·excel·aspose.cells·excel图表·excel api库·excel折线图
BBB努力学习程序设计29 分钟前
Python异步编程完全指南:从asyncio到高性能应用
python·pycharm
deephub29 分钟前
机器学习时间特征处理:循环编码(Cyclical Encoding)与其在预测模型中的应用
人工智能·python·机器学习·特征工程·时间序列
追光天使33 分钟前
Python 连接数据库并遍历数据
python