【设计模式】行为型-解释器模式

文章目录

  • 前言
  • 一、概念
  • 二、核心结构
  • [三、Java 代码实现(加减运算解释器)](#三、Java 代码实现(加减运算解释器))
    • [1. 抽象表达式](#1. 抽象表达式)
    • [2. 终结符:数字](#2. 终结符:数字)
    • [3. 非终结符:加法](#3. 非终结符:加法)
    • [4. 非终结符:减法](#4. 非终结符:减法)
    • [5. 客户端(构建语法树并解释)](#5. 客户端(构建语法树并解释))
  • 四、优缺点
  • 五、应用场景
  • 六、总结

前言

  如果某个特定类型的问题频繁发生 ,且可以用简单语法、规则表达式 来表达,我们就可以构建一个解释器,让它解释这些"语法句子",从而解决问题。比如:SQL 解析、正则表达式、规则引擎、公式计算、DSL 等。解释器模式 就是为自定义语言、规则、表达式提供解释执行能力的行为型设计模式。


一、概念

  解释器模式(Interpreter Pattern) 是一种行为型设计模式 ,核心思想:
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

  简单理解:

  • 把语法规则 拆成一个个表达式;
  • 每个表达式负责解释自己;
  • 组合起来就能解释一整句话。

一句话总结:
自定义语法 → 拆成表达式 → 逐个解释。


二、核心结构

  1. AbstractExpression(抽象表达式)
    定义解释接口 interpret()。
  2. TerminalExpression(终结符表达式)
    最小单元,不能再拆(如数字、变量)。
  3. NonTerminalExpression(非终结符表达式)
    组合多个表达式(如 + - * / 逻辑运算)。
  4. Context(上下文)
    全局信息、变量、环境数据。
  5. Client
    构建语法树,调用解释。

三、Java 代码实现(加减运算解释器)

实现一个最简单的:数字 + 加法 + 减法 解释器。

1. 抽象表达式

java 复制代码
public interface Expression {
    int interpret();
}

2. 终结符:数字

java 复制代码
// 终结表达式:数字
public class NumberExpression implements Expression {
    private int number;

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

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

3. 非终结符:加法

java 复制代码
// 非终结:加法
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();
    }
}

4. 非终结符:减法

java 复制代码
// 非终结:减法
public class SubExpression implements Expression {
    private Expression left;
    private Expression right;

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

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

5. 客户端(构建语法树并解释)

解释:10 + 5 - 3

java 复制代码
public class Client {
    public static void main(String[] args) {
        // 10 + 5 - 3
        
        Expression num10 = new NumberExpression(10);
        Expression num5 = new NumberExpression(5);
        Expression num3 = new NumberExpression(3);

        // 10+5
        Expression add = new AddExpression(num10, num5);
        // (10+5)-3
        Expression sub = new SubExpression(add, num3);

        System.out.println("结果:" + sub.interpret());
    }
}

输出:

复制代码
结果:12

四、优缺点

优点

  • 语法由类表示,易扩展、易修改规则
  • 易于实现简单 DSL / 规则引擎
  • 符合开闭原则:新增表达式只需加类

缺点

  • 复杂文法会造成类爆炸
  • 效率低,不适合复杂语法
  • 调试困难

五、应用场景

  • 正则表达式引擎
  • SQL 解析器
  • 规则引擎(简单规则)
  • 公式计算(Excel 表达式)
  • 配置文件解析
  • 自定义 DSL 脚本

经典应用:

  • Java 正则 Pattern/Matcher
  • Spring EL 表达式
  • MyBatis OGNL
  • Aviator 表达式引擎

六、总结

  1. 解释器模式 = 自定义语法 + 表达式拆分 + 递归解释
  2. 核心:每个规则对应一个表达式类
  3. 结构:抽象表达式 + 终结/非终结表达式 + 上下文
  4. 适合简单语法、规则频繁变化的场景
  5. 复杂语法请用专业工具(ANTLR、JavaCC),不要手写解释器
相关推荐
.Hypocritical.17 小时前
JUC + 三大设计模式(单例、工厂、代理)
设计模式·juc·1024程序员节
是2的10次方啊19 小时前
设计模式与生活②:你只管点外卖,别管堡怎么做
设计模式
是2的10次方啊2 天前
设计模式与生活①:你的脸,为什么不能有第二个?
设计模式
高晶2 天前
ARM 嵌入式 Linux 命令系统 BusyBox 实战指南
linux·设计模式·程序员
高晶2 天前
语音合成与变声技术十大业务场景落地实战:从电商直播到规模化生产
设计模式·程序员
博风2 天前
19、设计模式应用举例:桥接模式:制作电视节目
设计模式·桥接模式
知守观2 天前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式
geovindu3 天前
rust: Mediator Pattern
开发语言·后端·设计模式·rust·中介者模式·行为模式
SENKS_DIGITAL3 天前
金属加工遇上数字化:通快展厅里的工业蜕变-森克思科技
科技·设计模式·展厅设计·展馆设计·科技展厅设计·展览设计·企业展厅设计
flower9803233 天前
C++消息总线软件开发框架AI重构版
c++·设计模式·架构