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

文章目录

  • 前言
  • 一、概念
  • 二、核心结构
  • [三、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),不要手写解释器
相关推荐
砍光二叉树2 小时前
【设计模式】行为型-备忘录模式
设计模式·备忘录模式
光影少年2 小时前
实现发布订阅模式
前端·javascript·设计模式
无籽西瓜a3 小时前
【西瓜带你学设计模式 | 第十一期 - 模板方法模式】模板方法模式 —— 流程骨架与钩子实现、优缺点与适用场景
java·后端·设计模式·软件工程·模板方法模式
砍光二叉树16 小时前
【设计模式】行为型-中介者模式
设计模式·中介者模式
sanzk20 小时前
工厂方法模式
设计模式
大数据新鸟1 天前
设计模式详解——外观模式
设计模式·外观模式
缘友一世1 天前
PentestGPT V2源码研究之工具层设计模式
设计模式
yinghuoAI20261 天前
电商视觉进入“无人区”:萤火AI如何用三把“手术刀”重构设计 workflow
设计模式·新媒体运营·产品运营·流量运营·用户运营·内容运营·设计规范
sg_knight1 天前
设计模式实战:观察者模式(Observer)
python·观察者模式·设计模式