23种设计模式23种设计模式
首页
介绍
  • 单例模式
  • 工厂方法模式
  • 抽象工厂模式
  • 建造者模式
  • 原型模式
  • 适配器模式
  • 桥接模式
  • 组合模式
  • 装饰器模式
  • 外观模式
  • 享元模式
  • 代理模式
  • 责任链模式
  • 命令模式
  • 解释器模式
  • 迭代器模式
  • 中介者模式
  • 备忘录模式
  • 观察者模式
  • 状态模式
  • 策略模式
  • 模板方法模式
  • 访问者模式
🚀 编程指南
首页
介绍
  • 单例模式
  • 工厂方法模式
  • 抽象工厂模式
  • 建造者模式
  • 原型模式
  • 适配器模式
  • 桥接模式
  • 组合模式
  • 装饰器模式
  • 外观模式
  • 享元模式
  • 代理模式
  • 责任链模式
  • 命令模式
  • 解释器模式
  • 迭代器模式
  • 中介者模式
  • 备忘录模式
  • 观察者模式
  • 状态模式
  • 策略模式
  • 模板方法模式
  • 访问者模式
🚀 编程指南
  • 行为型模式

    • 责任链模式 (Chain of Responsibility)
    • 命令模式 (Command)
    • 解释器模式 (Interpreter)
    • 迭代器模式 (Iterator)
    • 中介者模式 (Mediator)
    • 备忘录模式 (Memento)
    • 观察者模式 (Observer)
    • 状态模式 (State)
    • 策略模式 (Strategy)
    • 模板方法模式 (Template Method)
    • 访问者模式 (Visitor)

解释器模式 (Interpreter)

📖 通俗理解

想象一个计算器:

  • 输入:3 + 5 * 2
  • 输出:13

计算器需要"理解"这个表达式,知道 + 是加法,* 是乘法,还要知道先乘后加。

解释器模式就是:定义一种语言的语法,并实现一个解释器来解释该语言的句子。

🎯 解决什么问题?

当有一种简单的语言需要解释执行时,可以用解释器模式。

适合场景:

  • 表达式计算
  • 正则表达式
  • SQL 解析
  • 模板引擎

🌰 生活中的例子

  • 计算器:解释数学表达式
  • 翻译软件:解释不同语言
  • 编译器:解释编程语言

💻 Java 代码实现

场景:简单数学表达式计算

/**
 * 抽象表达式
 */
public interface Expression {
    int interpret();
}

/**
 * 终结符表达式:数字
 */
public class NumberExpression implements Expression {
    private int number;
    
    public NumberExpression(int number) {
        this.number = number;
    }
    
    @Override
    public int interpret() {
        return number;
    }
}

/**
 * 非终结符表达式:加法
 */
public 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();
    }
}

/**
 * 非终结符表达式:减法
 */
public 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();
    }
}

/**
 * 解析器
 */
public class Calculator {
    
    public int calculate(String expression) {
        Stack<Expression> stack = new Stack<>();
        String[] tokens = expression.split(" ");
        
        for (int i = 0; i < tokens.length; i++) {
            String token = tokens[i];
            
            if (token.equals("+")) {
                Expression left = stack.pop();
                Expression right = new NumberExpression(Integer.parseInt(tokens[++i]));
                stack.push(new AddExpression(left, right));
            } else if (token.equals("-")) {
                Expression left = stack.pop();
                Expression right = new NumberExpression(Integer.parseInt(tokens[++i]));
                stack.push(new SubtractExpression(left, right));
            } else {
                stack.push(new NumberExpression(Integer.parseInt(token)));
            }
        }
        
        return stack.pop().interpret();
    }
}

使用:

public class Client {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        
        System.out.println("10 + 5 = " + calculator.calculate("10 + 5"));
        System.out.println("20 - 8 = " + calculator.calculate("20 - 8"));
        System.out.println("10 + 5 - 3 = " + calculator.calculate("10 + 5 - 3"));
    }
}

输出:

10 + 5 = 15
20 - 8 = 12
10 + 5 - 3 = 12

⚠️ 注意事项

解释器模式比较少用,因为:

  1. 复杂语法难以维护
  2. 执行效率不高
  3. 可以用现有的解析工具替代(如 ANTLR)

✅ 适用场景

  1. 语法简单且稳定
  2. 执行效率不是关键
  3. 可以方便地用语法树表示

小结

解释器模式:定义语法规则,解释执行语言。

应用:正则表达式、Spring EL 表达式、SQL 解析

👉 下一篇:迭代器模式

Prev
命令模式 (Command)
Next
迭代器模式 (Iterator)