二十三种设计模式第二十一篇--解释器模式

news2024/9/21 4:33:40

解释器模式(Interpreter Pattern)是一种行为设计模式,它用于定义一种语言的语法结构和解释器,使得可以解释并执行特定的语法规则。该模式可以将复杂的语言表达式分解为更小的语法单元,并定义其解释过程。

解释器模式的核心组成部分包括:

抽象表达式(Abstract Expression):定义了解释器的接口,其中包含一个interpret()方法,负责解释语言表达式。

终结符表达式(Terminal Expression):实现了抽象表达式的接口,用于表示语言中的终结符,即不需要进一步解释的语法单位。

非终结符表达式(Nonterminal Expression):实现了抽象表达式的接口,用于表示语言中的非终结符,即需要进一步解释的语法单位。

上下文(Context):包含需要解释的语言表达式,以及保存解释器所需的上下文信息。

客户端(Client):创建并配置解释器,将需要解释的语言表达式传递给解释器进行解释执行。

使用解释器模式的优点包括:

  1. 易于扩展语言解释能力:通过添加新的终结符和非终结符表达式,可以扩展语言的语法规则和解释能力。
  2. 灵活的语言处理:可以将复杂的语法规则分解为简单的解释器组件,灵活地组合进行语言处理。
  3. 可维护性和可读性:通过对语言表达式的分解和解释过程的抽象,可以提高代码的可维护性和可读性。

在这里插入图片描述

/**
 * 抽象表达式(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
 */
public interface Expression {
   /**
    * 解析context内容是否满足要求
    * @param context
    * @return
    */
   public boolean interpret(String 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 and mike is a friend"));
      System.out.println("Julie is a married women? " 
      + isMarriedWoman.interpret("Married Julie"));
   }
}
/**
 * 多个表达式的或关系
 */
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 TerminalExpression implements Expression {

   //表达式的要求:
   private String data;
 
   public TerminalExpression(String data){
      this.data = data; 
   }

   /**
    * 判断 文本context是否满足   data的要求.
    * @param context
    * @return
    */
   @Override
   public boolean interpret(String context) {
      if(context.contains(data)){
         return true;
      }
      return false;
   }
}

然而,解释器模式也有一些限制和适用场景:

对于复杂的语法规则,可能需要大量的解释器组件和规则的定义,增加了代码的复杂性。可能对性能造成影响:由于解释过程需要进行递归调用,可能对性能产生影响。

学历不行也罢,技不如人也罢,只要你保持一颗上进的心,往某一个方面钻研,时间久了,你会发现自己不知不觉在成长,这一路上的经历,都是你最宝贵的财富,最重要的是你需要不断进取,不要荒废时光,学无止境,但是你可以钻研某一方面,技不在多,在于精。

20230801
BY: 罗小黑

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

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

相关文章

Pandas操作Excel

Pandas 是 Python 语言的一个扩展程序库,用于数据分析。 菜鸟教程:https://www.runoob.com/pandas/pandas-tutorial.html 读取Excel pd.read_excel(path,sheet_name,header) path:excel文件路径sheet_name:读取的sheet&#xff0…

下载的谷歌模型如何转为3dtiles

收费工具&#xff0c;学生党勿扰 收费金额1000元 已经购买过工具的大佬&#xff0c;可以免费更新 1 概述 上个月&#xff0c;写了一篇<<谷歌地图模型自动下载>>的文章&#xff0c;效果还不错&#xff0c;能够帮到一些同学。 但是&#xff0c;随着谷歌模型下载的越…

docker 安装 字体文件

先说一下我当前的 场景 及 环境&#xff0c;这样同学们可以先评估本篇文章是否有帮助。 环境&#xff1a; dockerphp8.1-fpmwindows 之所以有 php&#xff0c;是因为这个功能是使用 php 开发的&#xff0c;其他语言的同学&#xff0c;如果也有使用到 字体文件&#xff0c;那么…

MQ面试题3

1、讲一讲Kafka与RocketMQ中存储设计的异同&#xff1f; Kafka 中文件的布局是以 Topic/partition &#xff0c;每一个分区一个物理文件夹&#xff0c;在分区文件级别实现文件顺序写&#xff0c;如果一个Kafka集群中拥有成百上千个主题&#xff0c;每一个主题拥有上百个分区&am…

阿里13年员工自爆薪酬并坦言:虽然失业但还是赢麻了...

每月发薪资的那一天&#xff0c;是打工人最开心和盼望的日子&#xff0c;看到工资条&#xff0c;就会觉得之前辛苦的付出没有白费。 但是你期待过未来薪资上限是多少吗&#xff1f;你打算如何过这一生呢&#xff1f; 最近看到一个很吸引我的帖子&#xff1a;一85年阿里员工薪…

记录一次很傻逼的bug,希望大家引以为戒!

最近准备程序上线&#xff0c;测试上数据库连接是正常的&#xff0c;但是到正式上&#xff0c;数据库连接就一直报错&#xff0c;报错如下&#xff1a; 根据报错信息的提示&#xff0c;就是没有识别到url&#xff0c;但是因为正式服务器之前发布过其他的项目&#xff0c;是可以…

棕榈酰三肽-38——对额间纹,鱼尾纹,抬头纹和颈纹非常有效

简介 棕榈酰三肽-38由三个氨基酸组成&#xff0c;是一种双氧化的脂肽。这种肽的灵感源自于天然存在于胶原蛋白VI和层粘连蛋白中的一种三肽。 它可以在需要的地方&#xff0c;从内部重建肌肤&#xff0c;使皱纹平滑皮肤得到舒缓&#xff0c;尤其对额间纹&#xff0c;鱼尾纹&…

AI写作技巧,用ChatGPT写自媒体爆文的小技巧

Hi~我是专注于AI技术教程和项目实战的赤辰。 对于新手来说&#xff0c;要写出一篇引人入胜的自媒体文章并不容易&#xff0c;虽然ChatGPT可以帮我们完成写作过程的各个部分&#xff0c;但是&#xff0c;ChatGPT其实也并不能仅凭一个思路和一个主题就直接生成高质量的内容&…

Java 异常处理以及如何捕获和处理多个异常

捕捉和处理异常 在Java中&#xff0c;我们使用异常处理程序组件try&#xff0c;catch和finally块来处理异常。 为了捕获和处理异常&#xff0c;我们将try...catch...finally代码块放置在可能产生异常的代码周围。finally块是可选的。 try...catch...finally的语法为&#xf…

重学C++系列之STL库

一、什么是STL库 STL是“Standard Template Library”的缩写&#xff0c;中文翻译为“标准模板库”。CSTL是一套功能强大的C模板类&#xff0c;提供了通用的模板类和函数&#xff0c;这些模板类和函数可以实现多种流行和常用的算法和数据结构&#xff0c;如字符串操作、链表、队…

mybatisJava对象、list和json转换

1. 参考mybatis-plus mybatis Java对象、list和json转换 网上好多不靠谱&#xff0c;参考mybatis-plus中TableField&#xff0c;mybatis中自定义实现 这样不需要对象中属性字符串接收&#xff0c;保存到表中&#xff0c;都是转义字符&#xff0c;使用时还要手动转换为对象或者…

【UI自动化测试】Jenkins配置

前一段时间帮助团队搭建了UI自动化环境&#xff0c;这里将Jenkins环境的一些配置分享给大家。 背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&…

棱镜七彩成为“软件供应链安全推进工作组”首批成员单位

2023年7月29日&#xff0c;由基础软件质量控制与技术评价工业和信息化部重点实验室&#xff08;以下简称“实验室”&#xff09;举办的软件供应链安全研讨会暨软件供应链安全推进工作组成立会议在京成功召开。 会上&#xff0c;实验室委托中国软件评测中心&#xff08;工业和信…

助力质检维护,基于超轻量级分割模型ege-unet开发构建水泥基建裂缝分割识别系统

在前面的博文&#xff1a; 《参数量仅有50KB的超轻量级unet变种网络egeunet【参数和计算量降低494和160倍】医疗图像分割实践》 初步学习和实践了最新的超轻量级的unet变种网络在医疗图像领域内的表现&#xff0c;在上文中我们就说过会后续考虑将该网络模型应用于实际的生产业…

GNN+RA 文献阅读-- GNN对RA的建模

简述&#xff1a;主要是几篇 如何利用GNN 对 资源分配进行建模的paper&#xff0c;【1】【2】都是对无线链路建模&#xff0c;【3】比较有参考性&#xff0c;【4】偏于RL&#xff0c;对GNN表述模糊。 用GNN建模网络的思路&#xff1a; 1.Graph 是有向图还是无向图&#xff1f…

HarmonyOS 开发基础(二)组件拼凑简单登录页面

一、简单登录页面 Entry Component /* 组件可以基于struct实现&#xff0c;组件不能有继承关系&#xff0c;struct可以比class更加快速的创建和销毁。*/ struct Index {State message: string Hello Worldbuild() {// https://developer.harmonyos.com/cn/docs/documentation/…

万应低代码 7 月重点更新内容速递

速览版 详情版 低代码开发能力提升 业务逻辑 业务逻辑是什么&#xff1f; 在万应低代码中&#xff0c;「业务逻辑」指的是应用程序中的核心规则和功能&#xff0c;它决定了数据如何被处理和操作。就像搭积木一样&#xff0c;业务逻辑告诉计算机在特定情况下如何运行和响应。比…

【C语言】操作符----详解

&#x1f341; 博客主页:江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言——探索高效编程的基石 &#x1f4bb; 其他专栏&#xff1a;数据结构探索 &#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa; 社区&#xff1a;C/C之家社区 &#x1f341; 如果觉…

【投资笔记】美股要变天了?

美股上涨&#xff0c;但是风险溢价创新低 7月&#xff0c;标普和纳指创两年依赖首次5个月连涨&#xff0c;但是风险溢价创二十年新低&#xff1b;https://asset.wsj.net/dynamic-insets/charts/cdc_5387e4742a1ca607d6defc38_embed.html 如果这个指标为正&#xff0c;说明投资…

视频媒体有哪些?视频媒体采访服务怎么做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 一&#xff0c;在国内&#xff0c;主流的视频媒体包括&#xff1a; 1. 电视台&#xff1a;包括国家级、地方性和专业性电视频道&#xff0c;涵盖各类新闻、综艺、娱乐、体育等节目。 2…