17-Java解释器模式 ( Interpreter Pattern )

Java解释器模式

    • 摘要
    • 实现
    • 范例

  • 解释器模式(Interpreter Pattern)实现了一个表达式接口,该接口解释一个特定的上下文

  • 这种模式被用在 SQL 解析、符号处理引擎等

  • 解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式

摘要

1. 意图

  • 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子

2. 主要解决

  • 对于一些固定文法构建一个解释句子的解释器

3. 何时使用

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

4. 如何解决

  • 构件语法树,定义终结符与非终结符

5. 关键代码

  • 构件环境类,包含解释器之外的一些全局信息,一般是 HashMap

6. 应用实例

  • 编译器、运算表达式计算

7. 优点

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

8. 缺点

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

9. 使用场景

  • 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树;
  • 一些重复出现的问题可以用一种简单的语言来进行表达;
  • 一个简单语法需要解释的场景;

10. 注意事项

  • 可利用场景比较少,JAVA 中如果碰到可以用 expression4J 代替

实现

在这里插入图片描述

  1. 定义一个接口Expression和实现了Expression接口的实体类;
  2. 定义作为上下文中主要解释器的TerminalExpression类,其他的类OrExpression、AndExpression用于创建组合式表达式;
  3. 定义类InterpreterPatternDemo使用Expression类创建规则和演示表达式的解析;

范例

1. 创建一个表达式接口.

Expression.java

package com.demo.gof;
public interface Expression {public boolean interpret(String context);
}

2. 创建实现接口的实体类

RealImage.java

package com.demo.gof;
public class RealImage implements Image {private String fileName;public RealImage(String fileName){this.fileName = fileName;loadFromDisk(fileName);}@Overridepublic void display() {System.out.println("Displaying " + fileName);}private void loadFromDisk(String fileName){System.out.println("Loading " + fileName);}
}

ProxyImage.java

public class ProxyImage implements Image{private RealImage realImage;private String fileName;public ProxyImage(String fileName){this.fileName = fileName;}@Overridepublic void display() {if(realImage == null){realImage = new RealImage(fileName);}realImage.display();}
}

3. 当被请求时,使用 ProxyImage 来获取 RealImage 类的对象

ProxyPatternDemo.java

package com.demo.gof;
public class ProxyPatternDemo {public static void main(String[] args) {Image image = new ProxyImage("test_10mb.jpg");//图像将从磁盘加载image.display(); System.out.println("");//图像将无法从磁盘加载image.display();  }
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/ProxyPatternDemo.java
$ java  com.demo.gof.ProxyPatternDemo
Loading test_10mb.jpg
Displaying test_10mb.jpgDisplaying test_10mb.jpg

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

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

相关文章

buildadmim生成代码时让菜单有层级

当我们使用buildadmin生成代码的时候,在菜单的部分, 有时希望它生的是一个带有层级的菜单,有时候则想生成一个没有层级的菜单 like this 经过本人测试 如果我们要生成没有层级的菜单 我们可以在高级设置中的 相对位置处更改,同时…

使用java批量写入环境变量

环境需求 jdk版本&#xff1a;1.8 jna依赖&#xff1a; <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.10.0</version></dependency><dependency><groupId>net.java.…

ServletContext

ServletContext 1.共享数据 ServletContext servletContext this.getServletContext(); String username "徐凤年"; servletContext.setAttribute("username",username);ServletContext servletContext this.getServletContext(); String username (…

因果学习篇(2)-Causal Attention for Vision-Language Tasks(文献阅读)

Causal Attention for Vision-Language Tasks 引言 这篇论文是南洋理工大学和澳大利亚莫纳什大学联合发表自2021年的CVPR顶会上的一篇文献&#xff0c;在当前流行的注意力机制中增加了因果推理算法&#xff0c;提出了一种新的注意力机制&#xff1a;因果注意力(CATT)&#xff…

航芯防护组合拳「MCU+安全」,让数字资产加倍安全!

在这个万物互联的时代&#xff0c;数据安全的“飓风”正在袭来。随着集成电路的广泛应用&#xff0c;安全问题也日益凸显。从芯片漏洞到硬件攻击&#xff0c;这些问题都给集成电路的应用带来了严峻的挑战。一旦安全防线被突破&#xff0c;智能设备的数字资产安全将面临威胁。 …

电动自行车易着火的启示

电动自行车起火情况不时发生&#xff0c;上海雷卯EMC小哥分析原因&#xff0c;或许对您有所启示。 电动自行车容易发生起火的原因可能是由于电池管理系统&#xff08;BMS&#xff09;的保护功能不足或者电池质量问题导致的。要改进BMS的保护功能以减少火灾风险&#xff0c; 可…

【CSP】201403-3-命令行选项

CSP-201403-3-命令行选项 关键点&#xff1a;将整行字符串按空格分割 在解析命令行时&#xff0c;一个常见的需求是将整个命令行字符串分割成多个部分&#xff0c;通常以空格为分隔符。这些部分包括命令行工具的名称、选项&#xff08;可能带有前缀-或--&#xff09;和这些选项…

mongodb 图形界面工具 -- Studio 3T(下载、安装、连接mongodb数据库)

目录 mongodb 图形界面工具 -- Studio 3T下载安装第一次使用&#xff1a;注册添加一个连接&#xff08;连接 mongodb 数据库&#xff09;1、点击【添加新连接】&#xff0c;选择【手动配置我的连接设置】2、对 Server 设置连接数据3、连接的用户认证设置&#xff08;创建数据库…

航芯1-Wire安全认证新品上市,防抄板和耗材认证高性价比之选

随着用户产品附加值提升带来的对防抄板的需求&#xff0c;以及电池、医疗耗材、电子配件、IOT领域中对设备认证的需求&#xff0c;上海航芯经过多年的技术积累和对市场的理解&#xff0c;推出了高性价比的ACL16_Axx系列。 1-Wire单总线&#xff1a;小尺寸实现高效传输 ACL16_…

JAVA WEB开发 错误:无效发行版解决办法

1.首先查询本安装的jdk版本 在cmd中输入如下指令 2.打开file——progect structure 2.将这两处保持一致即可

一图看懂:什么是“新质生产力”?

◆2023年9月&#xff0c;首次提出“新质生产力”。 ◆2024年1月&#xff0c;强调“加快发展新质生产力&#xff0c;扎实推进高质量发展”。 ◆2024年3月&#xff0c;《政府工作报告》中提出&#xff0c;要大力推进现代化产业体系建设&#xff0c;加快发展新质生产力。充分发挥…

SpringBoot【问题 05】PostgreSQL数据库启用SSL后使用默认配置进行数据库连接(Navicat工具与Java程序)

官网SSL说明&#xff1a;https://www.postgresql.org/docs/9.1/libpq-ssl.html 1.配置 1.1 文件 使用SSL需要的4个文件&#xff0c;名称要一致&#xff1a; 客户端密钥&#xff1a;postgresql.keyJava客户端密钥&#xff1a;postgresql.pk8客户端证书&#xff1a;postgresq…

阿里云2核4G服务器支持人数并发测试,2核4G主机测评

阿里云2核4G服务器多少钱一年&#xff1f;2核4G配置1个月多少钱&#xff1f;2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

进制之间的转换

文章目录 编译过程进制转换1、进制的概念1.1 二进制1.2 八进制1.3 十六进制 进制在程序中的表现方式十进制转二进制将十进制转换成二进制&#xff08;除2反序取余法&#xff09;二进制转十进制&#xff08;权值法&#xff09; 八进制转十进制将十进制转换成八进制(除8反序取余法…

医药行业五大难题深度剖析:CRM解决方案助力突围

医疗行业关系着民生、经济乃至战备&#xff0c;是国民经济的重要组成部分。虽然近20年来我国医疗行业年均增长率维持在15%之上&#xff0c;但行业发展仍存在诸多问题。引进CRM管理系统可能是一个行之有效的解决方法。文中将为您整理医疗行业目前的五大挑战&#xff0c;以及CRM如…

Android Termux系统安装openssh实现公网使用SFTP远程访问

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

Processing基本形状内容和实例

一、Processing的基本形状内容和实例 1.Processing有一组专门绘制基本图形得图案。像线条这样的基本图形可以被连接起来创建更为复杂得形状&#xff0c;例如一片叶子或者一张脸。 2.为了绘制一条直线&#xff0c;我们需要四个参数&#xff0c;两个用于确定初始位置&#xff0c;…

判断连续数据同意特征的方法:插旗法

bool isMonotonic(int* nums, int numsSize) {int flag 2;for (int i 1; i < numsSize; i) {if (nums[i-1] > nums[i]) {if (flag 0)return false;flag 1;}else if (nums[i-1] < nums[i]) {if (flag 1)return false;flag 0;}}return true; }此代码较为简单&…

Sora:AI视频生成的新机遇与挑战

随着科技的飞速进步&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术已经深入渗透到社会的各个领域。其中&#xff0c;Sora这类基于AI的视频生成工具因其高度逼真的生成能力而备受瞩目。然而&#xff0c;正如一枚硬币有两面&#xff0…

nVisual+AI实现综合布线智能化运维管理

传统的综合布线系统依据TIA-606规范在配线架、跳线、面板上都粘贴了标签&#xff0c;标签作为一个综合布线项目中元器件的唯一标识&#xff0c;对综合布线日常运维管理过程中查询连接关系、定位设备位置至关重要&#xff0c;但标签所能记录的信息毕竟有限&#xff0c;因此可视化…