解释器模式(Interpreter Pattern)

解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一个语言的文法表示,并定义一个解释器用来处理该语言中的句子。这种模式常用于解析表达式或特定领域语言(DSL, Domain-Specific Language),比如数学表达式、正则表达式、SQL语句等。

体现的设计原则

  1. 单一职责原则:每个解释器类只负责解释一种语法结构,从而简化了每个类的职责。
  2. 开闭原则:可以在不修改现有代码的情况下扩展系统的功能,通过添加新的解释器类来实现新语法结构的支持。
  3. 封装变化:将文法规则的变化封装在解释器类中,使得客户端代码不受影响。

示例场景

假设我们需要构建一个简单的计算器,能够解析和计算基于加减法的表达式,例如 3 + 4 - 2。我们可以使用解释器模式来实现这个功能。

Java 代码示例

java 复制代码
// 抽象表达式接口
interface Expression {
    int interpret();
}

// 终结符表达式 - 数字
class NumberExpression implements Expression {
    private int number;

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

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

// 非终结符表达式 - 加法
class AddExpression implements 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 implements 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 ExpressionParser {
    public static Expression parse(String expression) {
        String[] tokens = expression.split(" ");
        Expression result = new NumberExpression(Integer.parseInt(tokens[0]));

        for (int i = 1; i < tokens.length; i += 2) {
            String operator = tokens[i];
            int number = Integer.parseInt(tokens[i + 1]);

            if (operator.equals("+")) {
                result = new AddExpression(result, new NumberExpression(number));
            } else if (operator.equals("-")) {
                result = new SubtractExpression(result, new NumberExpression(number));
            }
        }

        return result;
    }
}

// 客户端代码
public class InterpreterPatternDemo {
    public static void main(String[] args) {
        String input = "3 + 4 - 2";
        Expression expression = ExpressionParser.parse(input);

        System.out.println(input + " = " + expression.interpret());
    }
}

在这个例子中:

  • Expression 是抽象表达式接口,定义了所有具体表达式共有的方法 interpret
  • NumberExpression 是终结符表达式类,表示数字。
  • AddExpressionSubtractExpression 是非终结符表达式类,分别表示加法和减法操作。
  • ExpressionParser 是上下文类,负责解析输入字符串并生成相应的表达式对象。
  • 在客户端代码中,使用 ExpressionParser 来解析输入表达式,并调用 interpret 方法计算结果。

这样,我们可以通过解释器模式来实现对特定语言或表达式的解析和解释,从而支持复杂的计算和逻辑操作。