解释器模式(Interpreter Pattern)

解释器模式

说明

解释器模式(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);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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;}@Overridepublic 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.hqwc.cn/news/537271.html

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

相关文章

在ubuntu20通过docker部署zabbix6

部署Zabbix 6.x服务器在Ubuntu 20.04 LTS系统上使用Docker的方式可以简化安装过程并实现容器化管理。以下是一个简化的步骤指南: 步骤1:安装Docker和Docker Compose 确保你的Ubuntu系统已经安装了Docker和Docker Compose。如果没有,请执行以…

项目中日志采集实践:技术、工具与最佳实践

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 引言 一. 选择合适的日志框架 二. 配置日志框架 三. 使用…

Github 2024-03-14 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目9非开发语言项目1TypeScript项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42…

漫途桥梁结构安全监测方案,护航桥梁安全!

桥梁作为城市生命线的重要组成部分,承载着城市交通、物流输送、应急救援等重要职能。然而,随着我国社会经济的飞速发展,桥梁所承载的交通流量逐年增长,其安全性所面临的挑战亦日益严峻。例如恶劣的外部环境、沉重的荷载以及长期使…

17.获取帖子列表

文章目录 一、建立帖子表结构并插入一些测试数据二、通过SQL建立对应的数据模型三、建立路由四、开发GetPostListHandler五、编写logic六、编写dao层七、编译测试运行 一、建立帖子表结构并插入一些测试数据 create table post (id bigint auto_increment primary k…

Mysql 死锁案例4-delete 相邻记录导致死锁

死锁复现 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB DEFAULT CHARSETutf8;/*Data for the table t */insert into t(id,c,d) values (0,0,0),(5,5,5),(10,10,10),(15,15,15) 事务1事…

easyrecovery破解版百度云(含Mac/Win版)以及EasyRecovery可以恢复哪些设备

软件介绍 当不小心将回收站的文件删除了怎么办?想找回但是不知道怎么找回需要的数据文件?别担心今天小编就为大家介绍一款非常专业的电脑数据文件恢复工具,easyrecovery14是由Ontrack专为电脑用户推出的一款专业的数据恢复软件&…

Go——数组

Golang Array和以往认知的数组有很大的。 数组是同一种数据类型的固定长度的序列。数组定义:var a[len] int,比如:var a [5]int,数组长度必须是常量,且类型的组成部分。一旦定义,长度不能变。长度是数组类…

ip广播智慧工地广播喊话号角 IP网络号角在塔吊中应用 通过寻呼话筒预案广播

ip广播智慧工地广播喊话号角 IP网络号角在塔吊中应用 通过寻呼话筒预案广播 SV-704XT是深圳锐科达电子有限公司的一款壁挂式网络有源号角,具有10/100M以太网接口,可将网络音源通过自带的功放和号角喇叭输出播放,可达到功率50W。SV-704XT内置有…

机器学习模型—随机森林

机器学习模型—随机森林 随机森林(Random Forest)是由斯坦福大学教授Tin Kam Ho在1995年提出的一种组合学习模型。它可以用于分类和回归任务,并在很多现实世界的问题中表现出优异的性能。 随机森林本质上是通过构建多颗决策树,然后将单个树的预测结果进行组合,从而获得更加准…

Cesium--基于材质旋转图片

材质部分的代码如下 // 自定义材质const customMaterial new Cesium.Material({translucent: true,fabric: {uniforms: {image:circle_img,speed:30.0,},source: czm_material czm_getMaterial(czm_materialInput materialInput){czm_material material czm_getDefaultMateri…

【软考高项】四、信息化发展之数字中国

1、数字经济 定义:从本质上看,数字经济是一种新的技术经济范式,它建立在信息与通信技术的重大突破的基础上,以数字技术与实体经济融合驱动的产业梯次转型和经济创新发展的主引擎,在基础设施、生产要素、产业结构和治理…