设计模式-解释器模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397)

定义

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

特点

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

使用场景

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

优缺点

(1) 优点
    • 可扩展性比较好,灵活。
    • 增加了新的解释表达式的方式。
    • 易于实现简单文法。
(2) 缺点
    • 可利用场景比较少。
    • 对于复杂的文法比较难维护。
    • 解释器模式会引起类膨胀。
    • 解释器模式采用递归调用方法。

模式结构

    • 定义一个抽象表达式(Expression)接口,它包含了解释方法 interpret(String info)。
    • 定义一个终结符表达式(Terminal Expression)类,它用集合(Set)类来保存满足条件的城市或人,并实现抽象表达式接口中的解释方法 interpret(Stringinfo),用来判断被分析的字符串是否是集合中的终结符。
    • 定义一个非终结符表达式(AndExpressicm)类,它也是抽象表达式的子类,它包含满足条件的城市的终结符表达式对象和满足条件的人员的终结符表达式对象,并实现 interpret(String info) 方法,用来判断被分析的字符串是否是满足条件的城市中的满足条件的人员。
    • 最后,定义一个环境(Context)类,它包含解释器需要的数据,完成对终结符表达式的初始化,并定义一个方法 freeRide(String info) 调用表达式对象的解释方法来对被分析的字符串进行解释。

具体实现

接口和实现

/*** 抽象表达式类*/
interface Expression {/*** 解释*/boolean interpret(String info);
}/*** 非终结符表达式类*/
class AndExpression implements Expression {private Expression city = null;private Expression person = null;public AndExpression(Expression city, Expression person) {this.city = city;this.person = person;}public boolean interpret(String info) {String s[] = info.split("的");return city.interpret(s[0]) && person.interpret(s[1]);}
}/*** 终结符表达式类*/
class TerminalExpression implements Expression {private Set<String> set = new HashSet<>();public TerminalExpression(String[] data) {set.addAll(Arrays.asList(data));}public boolean interpret(String info) {if (set.contains(info)) {return true;}return false;}
}

环境类

/*** 环境类*/
class Context {private String[] cities = {"武汉"};private String[] persons = {"老人", "妇女", "儿童"};private Expression cityPerson;public Context() {Expression city = new TerminalExpression(cities);Expression person = new TerminalExpression(persons);cityPerson = new AndExpression(city, person);}public void freeRide(String info) {boolean ok = cityPerson.interpret(info);if (ok) System.out.println("您是" + info + ",您本次乘车免费!");else System.out.println(info + ",您不是免费人员,本次乘车扣费2元!");}
}

具体使用

/*** 状态模式* 介绍链接:https://www.kdocs.cn/l/ct3ki9na5JMo<pre>文法规则<expression> ::= <city>的<person><city> ::= 武汉<person> ::= 老人|妇女|儿童</pre>
*/
public class App {public static void main(String[] args) {Context bus = new Context();bus.freeRide("武汉的老人");bus.freeRide("武汉的年轻人");bus.freeRide("深圳的妇女");bus.freeRide("深圳的儿童");}
}

实际应用

  1. 存款利息计算(设置好计算规则)

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

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

相关文章

vue3 组件刷新

在 Vue 3 中&#xff0c;如果你想刷新一个组件&#xff0c;有几种方法可以实现。 使用 key 属性: 当你想要强制重新渲染一个组件时&#xff0c;你可以为其添加一个独特的 key 属性。当 key 属性的值改变时&#xff0c;Vue 会强制组件重新创建。 <template> <MyComp…

jQuery 中的toggleClass应用 (含代码)

直接上代码 <!DOCTYPE html> <html><head><style>.info {color: green;}</style></head><body><input type"button" value"点击" onclick"changeClass()" /><div id"x1">例子…

第十五届蓝桥杯国赛前的问题记录

文章目录 遇到的问题问题解析1.生成m-n的随机数&#xff0c;包括俩个数在内2.fetch解析后如何获取结果3.获取多选下拉框&#xff08;select标签设置multiple属性&#xff09;的值4.如何删除某个获取到的节点5.vue中遇到多选下拉框如何处理 小结 遇到的问题 生成m-n的随机数fet…

(delphi11最新学习资料) Object Pascal 学习笔记---第12章第3节 ( RTL 中的类引用 )

12.3.1 RTL 中的类引用** ​ System 单元和其他核心 RTL 单元声明了许多类引用&#xff0c;包括以下几种&#xff1a; TClass class of TObject; ExceptClass class of Exception; TComponentClass class of TComponent; TControlClass class of TControl; TFormClass c…

Nginx企业级负载均衡:技术详解系列(9)—— Nginx核心配置详解(全局配置)

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。‍‍‍‍‍ 在 Nginx企业级负载均衡&#xff1a;技术详解系列&#xff08;8&#xff09;—— Nginx核心配置详解&#xff08;默认配置文件&#xff09;文章中&#xff0c;咱们讨论了Nginx核心配置文件的基础知识&#…

【Python设计模式11】建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它将一个复杂对象的构建过程分离出来&#xff0c;使得同样的构建过程可以创建不同的表示。建造者模式通过使用多个简单的对象一步一步构建成一个复杂的对象。 建造者模式的结构 建造者模式…

centos9 stream在线安装NVIDIA驱动(rockylinux9.4也成功安装nvidia驱动)

Install NVIDIA Drivers on CentOS Stream 9&#xff08;rockylinux9.4成功&#xff09; 主板为技嘉mz72-hb2 显卡为4090 一.Disable Secure Boot From the BIOS 二.Enabling the EPEL Repository on CentOS Stream 9 1.update the DNF package repository cache sudo dnf …

STM32控制HC-SR04超声模块获取距离

欢迎入群共同学习交流 时间记录&#xff1a;2024/5/23 一、模块介绍 &#xff08;1&#xff09;引脚介绍 VCC&#xff1a;电源引脚&#xff0c;接单片机3.3/5V GND&#xff1a;电源地 Trig&#xff1a;超声信号触发引脚 Echo&#xff1a;超声信号接收引脚 &#xff08;2&…

java.util.Arrays 详解

排序 sort(int[] a): 对指定 int 型数组按数字升序进行排序。sort(Object[] a): 对指定对象数组进行排序&#xff08;对象的类必须实现 Comparable 接口&#xff09;。sort(T[] a, Comparator<? super T> c): 使用指定的比较器对数组进行排序。sort(int[] a, int fromI…

给你一把接口响应断言神器,你要不要?

JSON Schema是用来标记和校验JSON数据&#xff0c;类似于XMLSchema,可用在自动化测试验证JSON数据。 官网&#xff1a;http://json-schema.org/ 最常用版本&#xff1a;draft 04。&#xff08;目前各类编程语言对draft 04支持最广泛&#xff09; 举个例子 假如你有一个接口…

202473读书笔记|《但愿呼我的名为旅人:松尾芭蕉俳句300》——围炉夜话,身顿心安,愿每个人都能在爱里自由驰骋

202473读书笔记|《但愿呼我的名为旅人&#xff1a;松尾芭蕉俳句300》——围炉夜话&#xff0c;身顿心安&#xff0c;愿每个人都能在爱里自由驰骋 &#x1f60d;&#x1f60d;&#x1f929;&#x1f929; 译者序正文二正文三正文四正文五正文六正文七 《但愿呼我的名为旅人&…

Lua中table.sort()使用方式

table.sort(tab,compare) 参数如下&#xff1a; tab:表名 compare:比较规则函数名 简略写法&#xff1a; a {1,2,3} table.sort(a,function(a,b) return a>b end) compare这个参数是一个函数&#xff0c;它有两个参数&#xff0c;你可以理解为表中的两个不同元素&…

智能进化:让AI大模型变得更聪明的路径探索

前言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;大模型在多个领域展现出了前所未有的能力。然而&#xff0c;它们仍然面临着理解力、泛化能力和适应性等方面的挑战。如何让大模型变得更聪明&#xff0c;是当前AI研究和应用的一个重要课题。本文将探讨…

解除网页禁止选择

控制台输入以下命令 复制&#xff1a;javascript:void(document.body.οncοpy) 可选&#xff1a;javascript:void(document.body.onselectstart) 拖拉&#xff1a;javascript:void(document.body.οnmοuseup)

C++实现基于http协议的epoll非阻塞模型的web服务器框架(支持访问服务器目录下文件的解析)

使用方法&#xff1a; 编译 例子&#xff1a;./httpserver 9999 ../ htmltest/ 可执行文件 端口 要访问的目录下的 例子&#xff1a;http://192.168.88.130:9999/luffy.html 前提概要 http协议 &#xff1a;应用层协议&#xff0c;用于网络通信&#xff0c;封装要传输的数据&…

npm install [Error]

npm install 依赖的时候报错 依赖版本问题的冲突&#xff0c;忽视即可 使用 npm install --legacy-peer-deps

剪画小程序:3个分离人声提取小技巧,赶紧收藏起来吧!

Hello&#xff01;大家好呀&#xff01;这里是社会主义搬砖人小画&#xff01; 人声分离&#xff0c;是指将混合在一起的人声和其他声音&#xff08;如背景音乐、环境噪音等&#xff09;分离开来&#xff0c;提取出单独的人声部分的过程。 在实际应用中&#xff0c;人声分离技…

leetcode654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索

654.最大二叉树 构造树一般采用的是前序遍历&#xff0c;因为先构造中间节点&#xff0c;然后递归构造左子树和右子树 确定递归函数的参数和返回值 参数传入的是存放元素的数组&#xff0c;返回该数组构造的二叉树的头结点&#xff0c;返回类型是指向节点的指针。 TreeNode…

Unity 开发Hololens,制作面板跟随眼镜一起移动,(面板跟踪)

Hololens滑动框以及面板跟踪 创建空物体&#xff0c;并添加组件 SolverHandler、RedialView、FollowMeToggle 创建按钮&#xff0c;控制停止/开始跟踪 创建一个Hololens自带的按钮放到右上角&#xff0c;并添加事件 创建蓝色背景板 创建空物体Backplate&#xff0c;下面再…

个体因果效应估计|EDVAE:用于个体治疗效果估计的反事实推理中的解开潜在因素模型

【摘要】根据观察数据估计个体治疗效果&#xff08;ITE&#xff09;是一项至关重要但具有挑战性的任务。解缠结表示已用于将代理变量分为混杂变量、工具变量和调整变量。然而&#xff0c;根据观测数据准确地进行反事实推理来识别 ITE 仍然是一个悬而未决的问题。在本文中&#…