二十一、设计模式之解释器模式

news2024/11/15 5:26:28

目录

  • 二十一、设计模式之解释器模式
    • 能帮我们干什么?
      • 主要解决什么问题?
      • 优缺点
        • 优点
        • 缺点:
    • 使用的场景
    • 角色和职责
    • 实现
      • 解释器
    • 总结

在这里插入图片描述

二十一、设计模式之解释器模式

所属类型定义
行为型允许你定义一个语言并解释该语言中的表达式

能帮我们干什么?

主要解决什么问题?

主要解决的是对于一些固定文法构建一个解释句子的解释器。
何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

优缺点

优点

1、可扩展性比较好,灵活。
2、增加了新的解释表达式的方式。
3、易于实现简单文法。

缺点:

1、可利用场景比较少。
2、对于复杂的文法比较难维护。
3、解释器模式会引起类膨胀。
4、解释器模式采用递归调用方法。


使用的场景

一种语法,主要用在编译器、规则引擎、正则表达式

角色和职责

在这里插入图片描述

  • Context 解释器上下文环境类
    用来存储解释器的上下文环境,包含解释器之外的一些全局信息,比如需要解释的文法等
  • AbstractExpression 解释器抽象类,抽象表达式
    这个接口为抽象语法树中所有节点所共享
  • TerminalExpression 解释器具体实现类,终结符表达式
    实现与文法中的终结符相关联的解释操作
    一个句子中的每个终结符需要该类的一个实例
  • NonterminalExpression 解释器具体实现类,非终结符表达式
    对文法中的每一个规则R :: = RR…R都需要一个NonterminalExpression类。
    为从R到R的每个符号都维护一个AbstractExpression类型的实例变量。
    为文法中的非终结符实现解释操作。解释一般要递归地调用表示R到R的那些对象的解释操作。
  • Client 客户
    构建(或被给定)表示该文法定义的语言中一个特定的句子的抽象语法树。该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。
    调用解释操作。

实现

这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

https://gitcode.net/k316378085/Java/-/tree/master/java/com/kongxiang/raindrop/dp/type/behavior/interpreter

解释器

如何解决:构建语法树,定义终结符与非终结符。

实现难度: ⭐️ ⭐️ ⭐️ ⭐️ ⭐️

public interface Expression {
   public boolean interpret(String context);
}

public class TerminalExpression implements Expression {
   
   private String data;
 
   public TerminalExpression(String data){
      this.data = data; 
   }
 
   @Override
   public boolean interpret(String context) {
      if(context.contains(data)){
         return true;
      }
      return false;
   }
}
public class OrExpression implements Expression {
    
   private Expression expr1 = null;
   private Expression expr2 = null;
 
   public OrExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }
 
   @Override
   public boolean interpret(String context) {      
      return expr1.interpret(context) || expr2.interpret(context);
   }
}

public class AndExpression implements Expression {
    
   private Expression expr1 = null;
   private Expression expr2 = null;
 
   public AndExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }
 
   @Override
   public boolean interpret(String context) {      
      return expr1.interpret(context) && expr2.interpret(context);
   }
}

public class InterpreterPatternDemo {
 
   //规则:Robert 和 John 是男性
   public static Expression getMaleExpression(){
      Expression robert = new TerminalExpression("Robert");
      Expression john = new TerminalExpression("John");
      return new OrExpression(robert, john);    
   }
 
   //规则:Julie 是一个已婚的女性
   public static Expression getMarriedWomanExpression(){
      Expression julie = new TerminalExpression("Julie");
      Expression married = new TerminalExpression("Married");
      return new AndExpression(julie, married);    
   }
 
   public static void main(String[] args) {
      Expression isMale = getMaleExpression();
      Expression isMarriedWoman = getMarriedWomanExpression();
 
      System.out.println("John is male? " + isMale.interpret("John"));
      System.out.println("Julie is a married women? " 
      + isMarriedWoman.interpret("Married Julie"));
   }
}

总结

解释器模式为某个语言定义它的语法表示,并定义一个解释器用来处理这个语法。

语言:不仅仅指平时说的中、英、日、法等各种语言。从广义上来讲,只要是能承载信息的载体,我们都可以称之为“语言”,比如,古代的结绳记事、盲文、哑语、摩斯密码等。

一些应用提供了内建(Build-In)的脚本或者宏语言来让用户可以定义他们能够在系统中进行的操作。解释器模式的目的就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过这个解释器来解释语言中的句子。

解释器模式的使用可以使你更容易地实现特定语言的解释和执行,尤其在处理自定义的领域特定语言(DSL)时非常有用。然而,解释器模式可能导致类的数量增加,因为每个语法规则都需要一个相应的表达式类。此外,解释器模式可能会对性能产生影响,特别是在处理复杂语法时。

总之,解释器模式适用于需要解释和处理特定语言或表达式的情况,它通过将语句表示为抽象语法树并提供解释器来执行解释。这有助于实现定制的语言处理逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1133897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++之lambda匿名函数总结(二百四十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

基于springboot实现人事管理系统项目【项目源码+论文说明】

基于springboot实现人事管理系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件…

WordPress简约响应式个人博客Kratos主题

Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净,简单且响应迅速的博客主题 下载地址 qnziyw点cn/cmsmb/wordpress/6559点html 注意:点换成小数点就可以了

【lesson2】数据库的库操作

文章目录 库操作创建数据库删除数据库字符集和校验规则手动设置字符集和校验集不同字符集和校验集之间的区别修改数据库字符集和校验集备份和恢复数据库 库操作 创建数据库 删除数据库 字符集和校验规则 创建数据库的时候,有两个编码集: 1.数据库编码集…

数据结构与算法之矩阵: Leetcode 48. 旋转矩阵 (Typescript版)

旋转图像 https://leetcode.cn/problems/rotate-image/ 描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1 输入&…

tooltip实现悬停内容染色

一: 通过highlight.js项目实现对json字符串的染色高亮 此项目是jsp文件,并且引用了element-ui/highlight.js的组件 二: 实现效果 三: 代码实现 关键点在于成功引入相关的js及css,并且在tooltip渲染时进行数据染色。再将染色后的数据放到v-html中进行页面渲染(关键方…

智能视频监控平台EasyCVR级联后,上级平台如何获取下级的云端录像?

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等。 有用户咨询,在EasyCVR级联上级时&#…

2023年香水行业数据分析:国人用香需求升级,高端香水高速增长

在人口结构变迁的背景下,“Z世代”作为当下我国的消费主力,正在将“悦己”消费推动成为新潮流。具备经济基础的“Z世代”倡导“高颜值”、“个性化”、“精致主义”,这和香水、香氛为代表的“嗅觉经济”的特性充分契合,因此&#…

字符设备驱动注册的本质及注册注销步骤,struct inode/file结构体作用

一、字符设备注册的本质及注册注销步骤 字符设备驱动注册的本质 只要某个信息存在于操作系统上,在操作系统中一定存在一个描述这个信息的对象,字符设备驱动注册进内核,在内核中一定会存在一个字符设备驱动对象保存当前的字符设备驱动的信息。…

【Unity】【VR】如何用键鼠模拟VR输入

【项目设置】 建立一个3D项目 Project Settings下最下方安装PlugIn Management,选中HMD 打开Windows->Package Manager->Unity Registry,列表下方XR Interaction Toolkit,点击Install,安装完成后再安装Sample&#xff0c…

北京等保测评:携手守护网络安全!

等保流程可以分为以下几个步骤:定级备案、初测及整改、测评和监督。 一、等保定级备案 根据《信息系统安全等级保护定级指南》和《信息安全等级保护管理办法》的要求,进行等保定级备案。包括以下几个步骤: 写信息安全管理制度,包括…

【Python学习】—Python基础语法(五)

【Python学习】—Python基础语法(五) 一、循环的嵌套使用 二、九九乘法表 #外层循环表示行数 for i in range(1,10):#内层循环表示每一行的数据for j in range(1,i1):#输出每一行的内容print(f"{i} * {j} {i * j} \t",end"") #外层…

2023 年最佳开源软件

InfoWorld 公布了 2023 年最佳开源软件榜单,旨在表彰年度领先的软件开发、数据管理、分析、人工智能和机器学习开源工具。 上榜的 25 个软件涵盖编程语言、运行时、应用程序框架、数据库、分析引擎、机器学习库、大型语言模型 (LLM)、用于部署 LLM 的工具等领域 Ap…

提升技能,挑战自我——一站式在线题库小程序

在这个信息爆炸的时代,我们总是在寻找一种方式,让自己在众多的知识海洋中快速提升技能,挑战自我。今天,我要向大家推荐一款全新的在线题库小程序KD蝌蚪阿坤,它将帮助你实现这个目标。 KD蝌蚪阿坤是一款全面的在线题库…

长城首款MPV上市,能否迎来「高山」时刻?

作者 | Amy 编辑 | 德新 去年下半年起,自主品牌接二连三抢占高端MPV市场,腾势D9、岚图梦想家、极氪009以及传祺E9等车型接连亮相。 国泰君安证券研究报告显示,新能源MPV 2021年、2022年年销量分别为4.4万和9.2万辆,今年上半年销…

Tp框架如何使用事务和锁,还有查询缓存

1.事务 在ThinkPHP框架中,可以使用think\db\Transaction类来实现事务。 use think\Db; use think\db\Transaction;// 开始事务 Db::startTrans();try {// 执行数据库操作Db::table(user)->where(id, 1)->update([name > John]);// 提交事务Db::commit(); }…

5、计算电机速度【51单片机控制步进电机-TB6600系列】

摘要:本节介绍用定时器定时的方式,精准控制脉冲时间,从而控制步进电机速度。 一、计算过程 电机每一步的角速度等于走这一步所花费的时间,走一步角度等于步距角,走一步的时间等于一个脉冲的时间: TB6600及…

Java中ThreadLocal对象的使用

目录 1、Threadlocal简介 2、ThreadLocal的主要方法: 2.1 initialValue():初始化ThreadLocal变量的值 2.2 set():为当前线程设置ThreadLocal变量的值 2.3 get():获取当前线程中ThreadLocal变量的值 2.4 remove()&#xff1a…

精简版STC单片机串口程序(只有初始化和sendbyte)

摘要:本文分享两个函数构成的STC单片机串口发送程序,代码占用空间极小。不想调用stdio.h和printf但是还想用串口发送简单的调试信息?那就试试它吧! 直接上代码 ,核心函数只有2个,如下所示 void UartInit(v…

newstar week3 pwn

newstar week3 pwn 巩固知识,如有错误记得纠正,感谢师傅们的评阅 puts or system? Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000)int __cdecl main(int argc, const…