当前位置: 首页 > news >正文

23种设计模式-解释器(Interpreter)设计模式

解释器设计模式

  • 🚩什么是解释器设计模式?
  • 🚩解释器设计模式的特点
  • 🚩解释器设计模式的结构
  • 🚩解释器设计模式的优缺点
  • 🚩解释器设计模式的Java实现
  • 🚩代码总结
  • 🚩总结

🚩什么是解释器设计模式?

解释器设计模式(Interpreter Pattern) 是一种 行为型设计模式,它定义了一个语言的文法,并建立一个解释器来解释该语言中的句子。这种模式通常用于SQL解析、符号处理引擎等场景中。

使用场景

  • 当需要 解释执行某种语言或表达式

  • 当语言文法 较为简单效率不是关键问题

  • 当需要 频繁地解释执行类似语法

  • 适用于 正则表达式SQL解析数学公式计算 等场景

🚩解释器设计模式的特点

  • 定义语言的文法:为语言创建语法规则

  • 构建解释器:为语法规则构建解释器

  • 扩展性好:可以方便地扩展和修改语法规则

  • 易于实现简单文法:对于简单文法实现起来非常直接

  • 解释执行:能够解释执行定义好的语言

🚩解释器设计模式的结构

解释器模式主要包含以下部分:

  • AbstractExpression(抽象表达式):声明一个抽象的解释操作

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

  • NonterminalExpression(非终结符表达式):实现文法中非终结符的解释操作

  • Context(上下文):包含解释器之外的一些全局信息

  • Client(客户端):构建表示该文法定义的语言中一个特定句子的抽象语法树

🚩解释器设计模式的优缺点

✅ 优点

  • 易于改变和扩展文法:因为使用类来表示文法规则

  • 易于实现简单文法:实现文法变得更容易

  • 增加新的解释表达式方便:符合开闭原则

  • 将语法分析与执行分离:语法分析由不同类完成

❌ 缺点

  • 复杂文法难以维护:对于复杂文法,类层次结构会变得庞大而难以管理

  • 执行效率较低:解释器模式通常使用递归调用,效率不高

  • 应用场景有限:只在特定领域(如编译器、规则引擎等)有用

🚩解释器设计模式的Java实现

代码地址:GitHub

  • 创建 Expression(抽象表达式) 接口
/**
 * @author hanson.huang
 * @version V1.0
 * @InterfaceName Expression
 * @Description 抽象表达式
 * @date 2025/3/25 17:38
 **/
public interface Expression {
    public boolean Interpret(String info);
}
  • 创建 TerminalExpression(终结符表达式)
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName TerminalExpression
 * @Description 终结符表达式
 * @date 2025/3/25 17:38
 **/
public class TerminalExpression implements Expression {

    private Set<String> set = new HashSet<>();

    public TerminalExpression(String[] data) {
        // for (遍历对象类型 对象名 : 遍历对象)
        for (String str : data) {
            set.add(str);
        }
    }

    @Override
    public boolean Interpret(String info) {
        return set.contains(info);
    }
}
  • 创建 NonterminalExpression(非终结符表达式)
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName NonterminalExpression
 * @Description 创建 NonterminalExpression(非终结符表达式)
 * @date 2025/3/25 17:42
 **/
public class NonterminalExpression implements Expression{

    private Expression region;
    private Expression person;

    public NonterminalExpression(Expression region, Expression person) {
        this.region = region;
        this.person = person;
    }

    @Override
    public boolean Interpret(String info) {
        String[] str = info.split("的");

        // B区的调试人员 --> str = {"B区", "调试人员"}
        return region.Interpret(str[0]) && person.Interpret(str[1]);
    }
}
  • 创建 Context(上下文)
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName Context
 * @Description 上下文
 * @date 2025/3/25 17:44
 **/
public class Context {
    private String[] regions = {"A区", "B区", "C区"};
    private String[] persons = {"开发人员", "测试人员", "调试人员"};

    private NonterminalExpression nonterminal;

    public Context() {
        TerminalExpression region = new TerminalExpression(regions);
        TerminalExpression person = new TerminalExpression(persons);
        nonterminal = new NonterminalExpression(region, person);
    }

    public void check(String info) {
        boolean bool = nonterminal.Interpret(info);
        if (bool) {
            System.out.println("识别成功");
        } else {
            System.out.println("识别失败");
        }
    }
}
  • 测试解释器模式
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName InterpreterPattern
 * @Description 测试解释器模式
 * @date 2025/3/25 17:47
 **/
public class InterpreterPattern {


    public static void main(String[] args) {
        Context context = new Context();

        context.check("A区的开发人员");
        context.check("B区的调试人员");
        context.check("C区的测试人员");

        System.out.println("==========");

        context.check("D区的程序员");
        context.check("D区的测试员");
        context.check("A区的程序员");
    }
}

📌 运行结果

在这里插入图片描述

🚩代码总结

  • Expression 接口定义了解释操作的统一方法

  • TerminalExpression 实现对终结符的解释

  • NonterminalExpression 实现对非终结符的解释,组合多个表达式

  • Context 维护全局信息并构建解释器

  • InterpreterPattern 客户端使用解释器解释特定语句

🚩总结

  • 解释器设计模式 为语言创建解释器,用于解释执行特定语法

  • 核心是 定义语言的文法并构建解释器 来解释语言中的句子

  • 适用于 简单文法解释 的场景,如正则表达式、SQL解析等

✅ Java源码中的应用场景:

  • Java正则表达式:

    • java.util.regex.Pattern 类实现正则表达式的解释

在这里插入图片描述

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述

相关文章:

  • html5炫酷3D数字时钟项目开发实践
  • systemd-networkd的配置文件的优先级 笔记250325
  • 【MySQL】MySQL B+树的查询数据过程是怎样的?
  • 【数据可视化艺术·进阶篇】热力图探秘:用色彩演绎场馆和景区的人流奥秘
  • 【读论文】——基于高光谱成像技术测定玉米籽粒硬度
  • 基于 arco 的 React 和 Vue 设计系统
  • 3.0 Disruptor的使用介绍(一)
  • RocketMQ 详细知识点总结
  • 分布式渲染与云渲染:技术与应用的黄金搭档
  • ‘算力智子‘的突破:DeepSeek引领AI发展新篇章
  • [C++面试] 你了解视图吗?
  • 1996-2023年全国31省政府干预度/财政干预度数据(含原始数据+计算过程+结果)
  • 【Python LeetCode Patterns】刷力扣,15 个学习模式总结
  • RK3568笔记八十: Linux 小智AI环境搭建
  • 内核编程十二:打印内核态进程的属性
  • 初级:集合框架面试题精讲
  • Qt开发:QInputDialog的使用
  • AI 的“幻觉”现象:深入解析 Hallucination 的成因与应对之道
  • MySQL 对text类型字段添加索引
  • 【RISC-V CPU debug 专栏 4.1 -- RISCV CSR C 内嵌汇编访问介绍】
  • 网站开发论文结论/网站制作公司网站
  • 做网站和app/重庆seo公司
  • 网站后台制作用的软件/在线培训平台有哪些
  • 工体做网站的公司/南宁网站关键词推广
  • 抓取网站后台/中国十大搜索引擎排名
  • 腾讯的网站建设用了多少钱/班级优化大师下载安装app