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

设计模式26——解释器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

解释器模式(Interpreter)

类行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、代码举例

2.1、对象之间的关系用UML图描述如下:

2.2、Java代码如下:


一、概述

1、给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

1.1、直观的理解

假设有2个解释器按顺序解释内容,那么:

可以看到内容被解释器一段一段的解释和翻译。

1.2、主要角色:

  • 解释器:解释器的抽象类或接口 + 具体的解释器实现类 (包括: 终结符表达式 + 非终结符表达式
  • 内容(Context):被解释的内容
  • 请求发起者(Client)

1.3、描述对象之间关系的UML图:

1.4、适用场景:

 1、如果一种特定类型的问题发送的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题;

2、可以更容易地改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变或扩展该文法;

3、当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式;

4、典型的例子有:正则表达式;

5、因为解释器模式为文法中的每一条规则至少定义了一个类,所以文法非常复杂时,还是建议使用其他技术如语法分析程序或编译器生成器来处理。

(注:当效率不是关键问题时,才会用此模式,如正则表达式更多情况下是转换为状态机来实现的。状态机是什么?我一时也说不出来什么,不过你可以在练习编程算法的网站上找相关的题去学习题解或练习。)

二、代码举例

假设现有两个解释器用来解释字符串的内容。

这个例子比较简单,就不再详细分析了。但你可以把本例当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图描述如下:

2.2、Java代码如下:

内容类:

public class Context {private String input;public String getInput() {return input;}public void setInput(String input) {this.input = input;}private String output;public String getOutput() {return output;}public void setOutput(String output) {this.output = output;}
}

解释器的抽象类:

abstract class AbstractExpression {public abstract void interpret(Context context);
}

解释器A:

public class ConcreteExpressionA extends AbstractExpression {@Overridepublic void interpret(Context context) {System.out.println("解释器A,处理中。。。。");}
}

解释器B:

public class ConcreteExpressionB extends AbstractExpression {@Overridepublic void interpret(Context context) {System.out.println("解释器B,处理中。。。。");}
}

主程序(发起请求的类):

public class Main {public static void main(String[] args) {Context context = new Context();//核心是解释器如何处理内容,以下只是最简单的举例List<AbstractExpression> expressionList = new ArrayList<>();expressionList.add(new ConcreteExpressionA());expressionList.add(new ConcreteExpressionB());expressionList.add(new ConcreteExpressionA());expressionList.add(new ConcreteExpressionB());for (AbstractExpression abstractExpression : expressionList) {abstractExpression.interpret(context);}}
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

http://www.lryc.cn/news/2392322.html

相关文章:

  • 在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.3,运行demo,显示label
  • ArcGIS 与 HEC-RAS 协同:流域水文分析与洪水模拟全流程
  • 树莓派设置静态ip 永久有效 我的需要设置三个 一个摄像头的 两个设备的
  • 多模态大语言模型arxiv论文略读(九十九)
  • Fine-tuning:微调技术,训练方式,LLaMA-Factory,ms-swift
  • vscode连接的linux服务器,上传项目至github
  • XCTF-web-mfw
  • indel_snp_ssr_primer
  • 图论核心:深度搜索DFS 与广度搜索BFS
  • Java 调用 HTTP 和 HTTPS 的方式详解
  • Redis--基础知识点--28--慢查询相关
  • 目标检测:YOLO 模型详解
  • HDFS存储原理与MapReduce计算模型
  • 电机控制选 STM32 还是 DSP?技术选型背后的现实博弈
  • .NET 开源工业视觉系统 OpenIVS 快速搭建自动化检测平台
  • 从0到1掌握Kotlin高阶函数:开启Android开发新境界!
  • 【OSS】 前端如何直接上传到OSS 上返回https链接,如果做到OSS图片资源加密访问
  • AI智能分析网关V4室内消防逃生通道占用检测算法打造住宅/商业/工业园区等场景应用方案
  • 商城前端监控体系搭建:基于 Sentry + Lighthouse + ELK 的全链路监控实践
  • Kotlin 中的数据类型有隐式转换吗?为什么?
  • 基于 HTTP 的邮件认证深入解读 ngx_mail_auth_http_module
  • 关于无法下载Qt离线安装包的说明
  • Java开发经验——阿里巴巴编码规范实践解析4
  • HTML应用指南:利用GET请求获取全国捞王锅物料理门店位置信息
  • 算法日记32:埃式筛、gcd和lcm、快速幂、乘法逆元
  • 黑马点评-分布式锁Lua脚本
  • P7-大规模语言模型分布式训练与微调框架调研文档
  • 机械师安装ubantu双系统:三、GPT分区安装Ubantu
  • ORM++ 封装实战指南:安全高效的 C++ MySQL 数据库操作
  • kafka学习笔记(三、消费者Consumer使用教程——从指定位置消费)