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.hqwc.cn/news/518384.html

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

相关文章

外汇天眼:伦敦金属交易所宣布新的高级领导任命

伦敦金属交易所(LME)今日宣布了多项高级领导职务任命和组织设计变更。 LME的任命将于2024年4月1日生效。 苏珊斯莫尔被任命为总法律顾问,负责监督LME及LME Clear的法律职能。斯莫尔女士将于6月加入,并将向LME及LME Clear的首席执…

销售管理之反向与正向目标控制

在销售活动中,控制力是关键。但控制力其实分为两种:反向控制和正向控制。本文将深入探讨这两种控制方式,并阐述如何在销售活动中加以应用,以提升销售效果。 一、反向控制:以客户为中心,引导客户需求 反向控…

主题乐园如何让新客变熟客,让游客变“留客”?

群硕跨越时间结识了一位爱讲故事的父亲,他汇集了一群幻想工程师,打算以故事为基础,建造一个梦幻的主题乐园。 这个乐园后来成为全球游客最多、收入最高的乐园之一,不仅在2023财年创下了近90亿(美元)的营收…

PolarDB for PostgreSQL-概述

阿里云数据库的概述 本篇罗列了一些知识点和结构。 日志 2. 同步复制:下降20% 异步复制:数据丢失风险, 部署 1.示例: vim polarx.toml 1.测试主库和备库数据一致性 备库是否一致性读 一个节点荡掉,提供服务。 GMS CN…

day15_商品列表商品详情用户注册登录

文章目录 1 商品列表1.1 需求说明1.2 查询所有品牌1.2.1 需求分析1.2.2 接口开发BrandControllerBrandServiceBrandMapperBrandMapper.xml 1.3 商品列表搜索1.3.1 需求分析1.3.2 接口开发ProductSkuDtoProductControllerProductServiceProductSkuMapperProductSkuMapper.xml 2 …

MySQL 学习笔记(基础篇 Day2)

「写在前面」 本文为黑马程序员 MySQL 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. MySQL 学习笔记(基础篇 Day1) 目录 3 函数 3.1 字符串函数 3…

文本溢出隐藏 显示省略号,鼠标悬浮展示 el-tooltip(TooltipIsShowMixin封装)

目录 mixins 封装使用 TooltipIsShowMixin效果展示 mixins 封装 TooltipIsShowMixin.js export const TooltipIsShowMixin {data() {return {tooltipIsShow: false}},methods: {tooltipIsDisHandler(className) {this.$nextTick(() > {const dom document.querySelector…

原生IP是什么?如何获取海外原生IP?

一、什么是原生IP 原生IP地址是互联网服务提供商(ISP)直接分配给用户的真实IP地址,无需代理或转发。这类IP的注册国家与IP所在服务器的注册地相符。这种IP地址直接与用户的设备或网络关联,不会被任何中间服务器或代理转发或隐藏。…

allure怎么生成测试报告简单方法

方法一:import pytest pytest.main([‘-s’,‘./执行文件名.py’,‘–alluredir’,‘./result’]) 方法二:os.system(‘allure generate result -o report --clean’) 1、点击index.html,右上角选择浏览器打开 2、查看界面化测试报告

Linux/Validation

Enumeration nmap 第一次扫描发现系统对外开放了22,80,4566和8080端口,端口详细信息如下 系统对外开放了4个端口,从nmap的结果来看,8080无法访问,手动尝试后4566也无法访问,只能从80端口开始 …

Redis分段锁,如何设计?

问题场景:热点库存扣减问题 秒杀场景,有一个难度的问题:热点库存扣减问题。 既要保证不发生超卖 又要保证高并发 如果解决这个高难度的问题呢? 答案就是使用redis 分段锁。 什么是分布式锁? 一个分布式系统中&am…

常见四种限流算法详解(附:javaDemo)

限流简介 现代互联网很多业务场景,比如秒杀、下单、查询商品详情,最大特点就是高并发,而往往我们的系统不能承受这么大的流量,继而产生了很多的应对措施:CDN、消息队列、多级缓存、异地多活。 但是无论如何优化&…