解释器模式(Interpreter Pattern)

news2024/11/16 6:01:02

解释器模式

说明

解释器模式(Interpreter Pattern)属于行为型模式,是指给定一门语言,定义它的语法(文法)的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。是一种按照规定的语法(文法)对语言进行解析的模式。
我们平时开发用的编译器,就是一种解释器的实现,通过规定好的编程语法,通过解析后转换成机器码,才能让计算机执行。某些领域也有其规范的语法,比如乐谱、莫斯码等等。解释器模式在开发中几乎不会用到,除非需要创建一门新的语言。

结构

解释器模式主要角色如下:
抽象表达式(Expression):定义解释语法的接口;
终结符表达式(TerminalExpression):实现Expression定义的解释方法。终结符表达式可以理解为语法中需要被操作的对象,比如1 + 2,1跟2都是终结符表达式;
非终结符表达式(NonterminalExpression):实现Expression定义的解释方法。非终结符表达式可以理解为语法中的运算符或者关键字,根据需求有不同的实现;
上下文环境类(Context):包含解释器之外的信息与逻辑,负责根据语法调用不同的解释器等功能。
解释器模式-类结构图

代码案例

抽象表达式(Expression)

/**
 * @program: interpreter
 * @description: 抽象表达式接口
 * @author: wxw
 * @create: 2024-03-13 18:33
 **/
public interface IExpression {

    String interpret();
}

非终结符表达式(NonterminalExpression)

/**
 * @program: interpreter
 * @description: 处理字符串表达式
 *              非终结符表达式(NonterminalExpression)
 * @author: wxw
 * @create: 2024-03-13 18:36
 **/
public abstract class ProcessingExpression implements IExpression {
    protected IExpression str;

    public ProcessingExpression(IExpression str) {
        this.str = str;
    }
}

/**
 * @program: interpreter
 * @description: 转换大写-处理字符串表达式
 *              非终结符表达式(NonterminalExpression)
 * @author: wxw
 * @create: 2024-03-13 18:44
 **/
public class UppercaseExpression extends ProcessingExpression {
    public UppercaseExpression(IExpression str) {
        super(str);
    }

    @Override
    public String interpret() {
        return str.interpret().toUpperCase();
    }
}

/**
 * @program: interpreter
 * @description: 转换小写-处理字符串表达式
 *              非终结符表达式(NonterminalExpression)
 * @author: wxw
 * @create: 2024-03-13 18:44
 **/
public class LowercaseExpression extends ProcessingExpression {
    public LowercaseExpression(IExpression str) {
        super(str);
    }

    @Override
    public String interpret() {
        return str.interpret().toLowerCase();
    }
}

/**
 * @program: interpreter
 * @description: 转换成char数组-处理字符串表达式
 *              非终结符表达式(NonterminalExpression)
 * @author: wxw
 * @create: 2024-03-13 18:44
 **/
public class CharsExpression extends ProcessingExpression {
    public CharsExpression(IExpression str) {
        super(str);
    }

    @Override
    public String interpret() {
        return Arrays.toString(str.interpret().toCharArray());
    }
}

终结符表达式(TerminalExpression)

/**
 * @program: interpreter
 * @description: 字符串终结表达式
 *              终结符表达式(TerminalExpression)
 * @author: wxw
 * @create: 2024-03-13 18:35
 **/
public class StringExpression implements IExpression {

    private String str;

    public StringExpression(String str) {
        this.str = str;
    }

    @Override
    public String interpret() {
        return this.str;
    }
}

上下文环境类

/**
 * @program: interpreter
 * @description: 上下文环境类
 * @author: wxw
 * @create: 2024-03-13 18:38
 **/
public class StringContext {

    private String str;

    public StringContext(String str) {
        this.str = str;
    }

    public String handleStr(){
        String[] strs = str.split(" ");
        String key = strs[0];
        IExpression str = new StringExpression(strs[1]);

        switch (key){
            case "uppercase":
                return new UppercaseExpression(str).interpret();
            case "lowercase":
                return new LowercaseExpression(str).interpret();
            case "chars":
                return new CharsExpression(str).interpret();
            default:
                return "输入错误!!!";
        }
    }
}

客户端

public class Test {
    public static void main(String[] args) {
        String str1 = "uppercase hello!!!";
        String str2 = "lowercase Hello!!!";
        String str3 = "chars hello!!!";

        StringContext stringContext1 = new StringContext(str1);
        System.out.println(stringContext1.handleStr());

        StringContext stringContext2 = new StringContext(str2);
        System.out.println(stringContext2.handleStr());

        StringContext stringContext3 = new StringContext(str3);
        System.out.println(stringContext3.handleStr());
    }
}

输出结果

HELLO!!!
hello!!!
[h, e, l, l, o, !, !, !]

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

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

相关文章

CVX安装新版本Mosek求解器

在使用连续凸近似(SCA)求解优化问题时遇到了报错 Problem status : ILL_POSED Solution status : PRIMAL_ILLPOSED_CER并且最后给出的结果为NaN。 在CVX论坛中找到一条回答 具体链接如下: The status is failed 因为我使用的是CVX自带的…

批量查询快递信息,固乔助手助您高效处理

在物流、供应链等行业,每天都需要处理大量的快递信息。无论是物流公司还是供应链企业,都需要实时掌握每一个包裹的状态和位置。然而,当面对成千上万的快递单号时,如何高效地查询这些信息成为了一个亟待解决的问题。 传统的查询方式…

IDEA直接打包Docker镜像

以下为使用IDEA打包Docker镜像并推送到远程仓库(使用Windows打包Docker镜像并推送到远程仓库)教程 1 安装Docker Desktop 下载地址:https://www.docker.com/products/docker-desktop/ 安装成功后,可在cmd查看版本号 2 启动Do…

Machine Learning ---- Feature Scaling

目录 一、What is feature scaling:: 二、Why do we need to perform feature scaling? 三、How to perform feature scaling: 1、Normalization: 2、Mean normalization: 3、Standardization (data needs to follow a normal distribution): 一、What is featur…

膨胀 卷积

1.作用 Dilated convolution、Atrous convolution 增大感受野保持原输入大小 2.膨胀因子 描述的是相邻元素之间的距离 r 2 3.gridding effect 不合理的多个膨胀卷积之前,设计的膨胀因子不合理导致,在增大感受野的同时丢失了细节信息。 丢失&…

【SpringCloud】使用Seata实现分布式事务

目录 一、Seata 框架的需求背景二、Seata 事务模式与架构2.1 Seata 组成2.2 Seata 事务模式 三、Seata 实战演示3.1 部署 Seata Server3.1.1 下载 Seata Server3.1.2 更改 Seata Server 配置3.1.3 创建 Seata Server 所需的数据库、数据库表3.1.4 启动 Seata Server 3.2 Seata …

判断闰年(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int year 2000;//执行循环判断&#xff1b;while (year < 2010){//执行流程&#xff1b;//判断能否整除4&#xff1…

十二、CyclicBarrier

CyclicBarrier 栅栏 什么时候满了开始发车 CyclicBarrier barrier new CyclicBarrier(20, () -> System.out.println("满人"));满20人开始发车每一个线程到达 barrier.await();都等着当 barrier.await();到达20人就开始往下执行 &#xff0c;发车 public…

struts2 CVE-2021-31805-struts2 s2-061 ONGL远程代码执行复现

复现&#xff1a; 切换到vulhub开启并且查看靶场的端口 访问页面 我们可以输入下面的命令来测试一下&#xff0c;执行6*6&#xff0c;查看源代码发现可以成功运行 接下来我们可以注入下面的payload来进行代码执行&#xff0c;执行id来查看当前用户 POST / HTTP/1.1 Host: x.x.…

探索Spring中的属性注入:@Value注解解析与应用

探索Spring中的属性注入&#xff1a;Value注解解析与应用 探索Spring中的属性注入&#xff1a;Value注解解析与应用摘要引言正文作用代码准备示例注入字符串注入属性注入Bean及其属性 其他属性注入优先级问题对Value属性注入的扩展Spring Boot对Value类型转换的扩展 代码案例演…

【GameFramework框架内置模块】8、文件系统(File System)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

代码随想录算法训练营第二十七天(第二十六天休息)|40.组合总和II

40.组合总和II 题目 给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明&#xff1a; 所有数字&#xff08;包括目标数&#xff09;都是正整数。解集…

Android 开发环境搭建(Android Studio 安装图文详细教程)

Android Studio 下载 https://developer.android.google.cn/studio?hlzh-cn Android Studio 安装 检查电脑是否启用虚拟化 如果没有开启虚拟化&#xff0c;则需要进入电脑的 BIOS 中开启 直接 next选择安装的组件&#xff0c;Android Studio 和 Android 虚拟设备&#xff…

使用蜂鸟地图完成楼层自定义、房间着色、热力图、添加图片覆盖物、添加dom覆盖物、定位到固定区域的中心点

项目里有用到蜂鸟地图的地方&#xff0c;虽然有跟她们对接&#xff0c;但看他们文档也挺费劲的&#xff0c;要自己慢慢研究好久&#xff0c;有些实在研究不出来让他们帮忙看代码发现一些问题&#xff0c;所以把我发现的需要注意的一些点发上来&#xff0c;希望可以帮助到部分有…

深入探讨ChatGPT:技术突破与应用前景

目录 一、ChatGPT究竟是什么&#xff1f; 二、ChatGPT的发展脉络 三、ChatGPT的突出优势 强大的语言生成能力 多场景适应性 多语言处理能力 广泛的应用范围 数据敏感性的重视 四、结语&#xff1a;ChatGPT的未来与挑战 Tips&#xff1a;国内的ChatGPT ⭐ 点击进入Chat…

【GIS系列】GeoTools简介及工具类分享

本文将对GeoTools相关概念进行介绍&#xff0c;同时会给大家分享我工作中用到的工具类及使用方法。 作者&#xff1a;后端小肥肠 目录 1.前言 2. GeoTools简介 3. Geotools使用示例 3.1. 开发环境搭建 3.1.1. 所需版本和工具 3.1.2. pom依赖​​​​​​​ 4. 工具类介绍…

为什么不用 index 做 key 引出的 Diff 算法

文章目录 问题分析 问题 大家耳熟能详的最常见的问题就是 为什么不用 index 做 key &#xff0c;在刚开始学习的时候&#xff0c;只是知道在 v-for 做循环遍历的时候需要加上唯一标识 key&#xff0c;但好像都是这么写的 v-for"(item,index) in dictList" :key"…

IT系统可观测性

什么是可观测性 可观测性&#xff08;Observability&#xff09;是指能够从系统的外部输出推断出系统内部状态的能力。在IT和云计算领域&#xff0c;它涉及使用软件工具和实践来收集、关联和分析分布式应用程序以及运行这些应用程序的硬件和网络产生的性能数据流。这样做可以更…

数据分析-Pandas序列时间移动窗口化操作

数据分析-Pandas序列时间移动窗口化操作 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表…

【考研数学】全年保姆级规划+资料选择

直接跟考研课学即可 跟宋浩学第一遍说是基础&#xff0c;但宋浩的课程毕竟针对的是大学期末考试&#xff0c;基础知识方面讲的可能没有考研课程全面&#xff0c;毕竟大学课程的授课时间和考核要求不同于考研。 备考之前对自己做一个评估&#xff0c;每一个要准备的科目和其中…