设计模式笔记_行为型_解释器模式

1.解释器模式介绍

解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义语言的语法表示,并且通过实现一个解释器来解析该语言的句子。它通常用于设计一个简单的语言解释器,或者在语法分析和编译器设计中使用。

类比场景: 可以将解释器模式类比为一个简单的计算器,它能够解释和计算基本的数学表达式,比如"3 + 5"。在这个例子中,每一个数字和运算符都是语言的基本元素,解释器能够识别这些元素并执行相应的计算。

**结构组成:**解释器模式通常包括以下几个组件:

  1. 抽象表达式(AbstractExpression):定义解释操作的接口。
  2. 终结符表达式(TerminalExpression):实现与语法中的终结符相关的解释操作。
  3. 非终结符表达式(NonTerminalExpression):实现与语法中的非终结符相关的解释操作。
  4. 上下文(Context):包含解释器之外的全局信息。

优点和局限性:

  • 优点
    • 易于实现简单的语言和语法。
    • 可以通过组合表达式轻松扩展语言的功能。
  • 局限性
    • 不适合复杂的语法结构,因为会导致类爆炸,难以维护。
    • 性能可能较低,因为每个语法解析都需要创建新的表达式对象。

适用场景

  • 适用于简单的解析任务,如自定义脚本语言、简单数学表达式计算等。
  • 不适合复杂语言解析器。

2.代码演示

演示场景: 模拟计算器,计算 x+(x-y) 的值。

抽象表达式(AbstractExpression):定义解释操作的接口

java 复制代码
// 抽象表达式
public interface Expression {
    // context 为上下文信息
    int interpret(Map<String, Integer> context);
}

终结符表达式(TerminalExpression):实现与语法中的终结符相关的解释操作

java 复制代码
// 终结符表达式
public class NumberExpression implements Expression {
    private String variable;

    public NumberExpression(String variable) {
        this.variable = variable;
    }

    @Override
    public int interpret(Map<String, Integer> context) {
        return context.get(variable);
    }
}

非终结符表达式(NonTerminalExpression):实现与语法中的非终结符相关的解释操作

java 复制代码
// 非终结符表达式
public class AddExpression implements Expression {
    private final Expression left;
    private final Expression right;

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

    @Override
    public int interpret(Map<String, Integer> context) {
        return left.interpret(context) + right.interpret(context);
    }
}

public class SubtractExpression implements Expression {
    private final Expression left;
    private final Expression right;

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

    @Override
    public int interpret(Map<String, Integer> context) {
        return left.interpret(context) - right.interpret(context);
    }
}

客户端代码:

java 复制代码
public class InterpreterClientDemo {
    public static void main(String[] args) {
        // 定义上下文
        Map<String, Integer> context = Map.of("x", 5, "y", 3);

        // 创建表达式
        Expression expression = new AddExpression(
            new NumberExpression("x"),
            new SubtractExpression(new NumberExpression("x"), new NumberExpression("y"))
        );

        // 解释表达式
        int result = expression.interpret(context);
        System.out.println("Result: " + result);  // 输出结果:Result: 7
    }
}

对应的类图: