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

2023-11-15

解释器模式(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: 罗小黑

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二十三种设计模式第二十一篇--解释器模式 的相关文章

随机推荐

  • webstorm快速配置react

    以下都是废话 建议看菜鸟教程 也推荐这一个链接 它是React几种基本配置方案 你可以根据需求选择合适的配置 默认你装了node js和npm还有ws2018 2 4 首先在设置 setting 里搜索lang 语言与框架 找到并JavaS
  • 怎样用Java求水仙花数和水仙花数的数量

    首先我们了解一下水仙花数的定义 一个各个位上的数字三次方之和等于他本身的三位数 因此 为了求水仙花数 我们的程序会有以下几个需求 1 首先表示出所有的三位数 用循环表示 这里用for循环示例 2 然后表示出其个位 十位 百位 3 当这个三位
  • Elasticsearch知识点

    目录 1 什么是Elasticsearch 2 Elasticsearch的特点 3 Elasticsearch基础概念 4 Elasticsearch基本数据类型 看这里 5 Elasticsearch基本检索类型 5 1 检索和过滤 5
  • python编译javascript_Js2Py - 把js代码翻译成python代码。也让你可以在python环境里运行js代码。...

    Pure Python JavaScript Translator Interpreter Everything is done in 100 pure Python so it s extremely easy to install an
  • top 命令解释和案例

    文章目录 Top结果 Task分析 CPU分析 内存分析 Top结果 在Linux系统中 top命令用于实时监控系统的性能和进程活动 当你在终端运行top命令时 会显示一个实时的进程列表和系统性能指标 top结果的详细描述如下 第一行 显示
  • Elasticsearch的配置及常见错误

    1 下载Elasticsearch到d盘 在elasticsearch yml中配置两项内容 其中cluster name对应springboot项目中application properties里elasticsearch配置的 elas
  • Java 日期 不同月按周分组

    日期按月 按周次分组 今天接到需求 要求按月份分开周次 12月31号和新一年的1月1号拆开两个组 2020 12 第五周 2020 12 28 2020 12 31 2021 01 第一周 2021 01 01 2021 01 03 咋一看
  • 设计模式——反射

    本文说明 在学习 Java EE互联网轻量级框架整合开发 此书时 里面提到了几种设计模式 我在学习这几种设计模式时写了笔记 放上来让大家共同学习 如果有错误 望指出 本章由两部分组成 1 基本概念 关键代码讲解 2 完整例子 基本概念 关键
  • vue3-实战-04-管理后台表单校验-layout-菜单组件封装

    目录 1 自定义校验规则 2 layout组件静态页面搭建 3 logo组件封装 4 左侧菜单静态组件搭建 4 1 动态获取菜单数据 4 2 封装菜单动态展示组件 4 3 配置菜单名称 隐藏 图标属性 4 4 菜单刷新定位当前菜单 5 内容
  • python大数据毕业设计题目100例

    文章目录 0 前言 1 python 算法类 毕设选题 2 python 数据挖掘 毕设选题 3 python 大数据处理 云计算 区块链 毕设选题 4 python 网络安全 毕设选题 5 python 游戏设计 动画设计类 毕设选题 适
  • mysql求两个表的不同记录

    问题是 现在有两个表 一个是记录昨天的记录 一个是记录今天的记录 如何求 1 新增的记录 今天有 昨天没有的记录 2 减少的记录 今天没有 昨天有的记录 求解该类问题 需要用到sql的连接查询 为了简单起见 使用user1表和user2表来
  • 更新linux内核方法

    背景 买了块网件的A6210无线网卡 用的是mt7612u芯片 插到deepin下不能识别 ubuntu 18 04下同样不能识别 查过内核版本号 用的都是4 15的内核 去Github查了Linux内核仓库 确认4 15内核里没有mt76
  • PHP网上花店管理系统 毕业设计源码21170

    目 录 摘要 1 绪论 1 1研究背景 1 2项目背景 1 3 Thinkphp框架介绍 1 4论文结构与章节安排 2 网上花店管理系统系统分析 2 1 可行性分析 2 2 系统流程分析 2 2 1数据增加流程 2 2 2数据修改流程 2
  • C++ STL编程轻松入门基础

    来源 天极网 作为C 标准不可缺少的一部分 STL应该是渗透在C 程序的角角落落里的 STL不是实验室里的宠儿 也不是程序员桌上的摆设 她的激动人心并非昙花一现 本教程旨在传播和普及STL的基础知识 若能借此机会为STL的推广做些力所能及的
  • 【华为OD机试真题2023B卷 JAVA&JS】解压报文

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 解压报文 知识点栈 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 为了提升数据传输的效率 会对传输的报文进行压缩处理 输入一个压缩后的报文 请返回它解压后的原始报文
  • 讯飞版大模型来了,现场发布四大行业应用成果

    文章目录 人工智能福利文章 前言 SparkDesk讯飞星火认知大模型简介 语言理解 知识问答 逻辑推理 数学题解答 代码理解与编写 亲自体验 写在最后 创作者 全栈弄潮儿 个人主页 全栈弄潮儿的个人主页 个人社区 欢迎你的加入 全栈弄潮儿
  • 梯度下降的作用及分类

    一 介绍 梯度下降法是一个最优化算法 通常也称 最速下降法 常用于机器学习和人工智能中递归性逼近最小偏差模型 梯度下降的方向就是用负梯度方向为搜索方向 沿着梯度下降的方向求解极小值 在训练过程中 每次的正向传播都会得到输出值和真实值的损失值
  • keras使用callbacks后报错:tensorflow.python.framework.errors_impl.NotFoundError: Failed to create a direct

    参考 https stackoverflow com questions 59439124 keras tuner search function throws failed to create a newwriteablefile err
  • Maven引入本地jar包的方法分享

    转自 maven中如何包含本地jar包呢 有时候我们的jar包来源于maven仓库 有时候来源于本地仓库 有时候来源于本地文件 来源于仓库的文件 我们只需输入相应的坐标即可 那么jar包来源于本地文件 如何处理呢 下文笔者讲述maven中包
  • 二十三种设计模式第二十一篇--解释器模式

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