侧边栏壁纸
博主头像
人生短短几个秋

行动起来,活在当下

  • 累计撰写 45 篇文章
  • 累计创建 20 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

设计模式-解释器模式

人生短短几个秋
2025-01-25 / 0 评论 / 0 点赞 / 14 阅读 / 0 字

设计模式 - 解释器模式(Interpreter Pattern)

介绍

解释器模式是一种行为设计模式,它允许你为语言定义一个语法表示,并且用一个解释器来解释语言中的句子。此模式可以用来定义语言的语法,并且编写一个解释器来解析这些语言。

实现

我们以一个简单的数学表达式解析器为例来展示解释器模式的应用。假设我们需要一个解释器来计算简单的数学表达式,如 (3 + 4) * 2

定义抽象表达式类

首先定义一个抽象表达式类,它声明了解释的方法。

abstract class Expression {
    abstract int interpret();
}

创建终端表达式类

然后创建终端表达式类,它们实现了 Expression 接口,并提供了具体的数值。

class NumberExpression extends Expression {
    private int number;

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

    @Override
    int interpret() {
        return number;
    }
}

创建非终端表达式类

接着创建非终端表达式类,它们实现了 Expression 接口,并包含了其他表达式作为子表达式。

class AdditionExpression extends Expression {
    private Expression left;
    private Expression right;

    public AdditionExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    int interpret() {
        return left.interpret() + right.interpret();
    }
}

class MultiplicationExpression extends Expression {
    private Expression left;
    private Expression right;

    public MultiplicationExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    int interpret() {
        return left.interpret() * right.interpret();
    }
}

创建解析树构建器

创建一个解析树构建器,它负责构建表达式树。

class ExpressionTreeBuilder {
    public Expression parse(String expression) {
        Stack<Expression> stack = new Stack<>();
        for (String token : expression.split(" ")) {
            switch (token) {
                case "+":
                    Expression right = stack.pop();
                    Expression left = stack.pop();
                    stack.push(new AdditionExpression(left, right));
                    break;
                case "*":
                    right = stack.pop();
                    left = stack.pop();
                    stack.push(new MultiplicationExpression(left, right));
                    break;
                default:
                    stack.push(new NumberExpression(Integer.parseInt(token)));
            }
        }
        return stack.pop();
    }
}

使用解释器模式

接下来,在主程序中使用解释器模式来计算数学表达式。

public class Calculator {
    public static void main(String[] args) {
        ExpressionTreeBuilder builder = new ExpressionTreeBuilder();
        Expression expr = builder.parse("(3 + 4) * 2");
        System.out.println("Result: " + expr.interpret()); // 输出 "Result: 14"
    }
}

使用场景

解释器模式适用于以下情况:

  • 你需要为特定的问题定义一个语言,并且需要一个解释器来解释这个语言。
  • 可以用一个简单的文法来描述语言。
  • 解释器的性能不是关键问题。

总结

解释器模式通过定义一个语法表示,并且用一个解释器来解释语言中的句子,使得你可以为特定的问题定义一个语言,并且解释这个语言。这种方式不仅增强了代码的可维护性和可扩展性,还能使得语言的解析逻辑更为清晰。


以上就是解释器模式的一个实现案例,希望这篇文章能帮助你理解解释器模式的使用方式及其优势。

0

评论区