【Java设计模式】二十三、解释器模式

文章目录

  • 1、解释器模式
  • 2、案例

1、解释器模式

计算一个表达式的值,比如1+2-3+4-7,单纯的定义方法或函数很难适配所有,因为数值和运算符可以有无数种组合。

//用于n个整数相加
public static int add(Integer ... arr) {int sum = 0;for (Integer i : arr) {sum += i;}return sum;
}

如果把运算符和数字看作一个个节点,逐个去读取和解析,则可适配所有。即定义一个解释器去解释表达式。解释器模式常用于SQL解析、符号处理引擎。主要角色:

  • 抽象表达式类:接口,定义解释操作,包含一个interpret方法
  • 终结符表达式类:下例中的变量或者值
  • 非终结表达式类:下例中的运算符(加法、减法)
  • 环境角色:传递被解释器共享的数据,解释器从这里获取值

2、案例

在这里插入图片描述

定义抽象表达式类,定义一个解释的方法,聚合环境类对象

//抽象角色AbstractExpression
public abstract class AbstractExpression {public abstract int interpret(Context context);
}

定义终结符表达式(变量类)

//终结符表达式角色 变量表达式
public class Variable extends AbstractExpression {private String name;public Variable(String name) {this.name = name;}@Overridepublic int interpret(Context ctx) {return ctx.getValue(this);}@Overridepublic String toString() {return name;}
}
//终结符表达式角色
public class Value extends AbstractExpression {private int value;  public Value(int value) {this.value = value;}@Overridepublic int interpret(Context context) {return value;}@Overridepublic String toString() {return new Integer(value).toString();}
}

将左边表达式和右边表达式的结果相加

//非终结符表达式角色  加法表达式
public class Plus extends AbstractExpression {private AbstractExpression left;  //+号左边的表达式private AbstractExpression right;  // +号右边的表达式public Plus(AbstractExpression left, AbstractExpression right) {this.left = left;this.right = right;}@Overridepublic int interpret(Context context) {//将左边表达式和右边表达式的结果相加return left.interpret(context) + right.interpret(context);}@Overridepublic String toString() {return "(" + left.toString() + " + " + right.toString() + ")";}
}
//非终结符表达式角色 减法表达式
public class Minus extends AbstractExpression {private AbstractExpression left;private AbstractExpression right;public Minus(AbstractExpression left, AbstractExpression right) {this.left = left;this.right = right;}@Overridepublic int interpret(Context context) {//将左边表达式和右边表达式的结果相减return left.interpret(context) - right.interpret(context);}@Overridepublic String toString() {return "(" + left.toString() + " - " + right.toString() + ")";}
}

环境角色类,定义一个Map集合,用来存储变量及对应的值

//环境类
public class Context {private Map<Variable, Integer> map = new HashMap<Variable, Integer>();//添加变量的功能public void assign(Variable var, Integer value) {map.put(var, value);}public int getValue(Variable var) {Integer value = map.get(var);return value;}
}

测试类:

//测试类
public class Client {public static void main(String[] args) {//创建环境对象Context context = new Context();Variable a = new Variable("a");Variable b = new Variable("b");Variable c = new Variable("c");Variable d = new Variable("d");Variable e = new Variable("e");//Value v = new Value(1);context.assign(a, 1);context.assign(b, 2);context.assign(c, 3);context.assign(d, 4);context.assign(e, 5);//获取抽象语法树对象AbstractExpression expression = new Minus(new Plus(new Plus(new Plus(a, b), c), d), e);//解释(计算)System.out.println(expression + "= " + expression.interpret(context));}
}

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

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

相关文章

Xpay源支付2.8.8免授权聚合免签系统

产品介绍 XPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI&#xff0c;让您可以更加方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的ThinkPHP 6.1.2 Layui 2.8.10 PearAdmin架构&#xff0c…

Learn OpenGL 08 颜色+基础光照+材质+光照贴图

我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的(Reflected)颜色。物体的颜色为物体从一个光源反射各个颜色分量的大小。 创建光照场景 首先需要创建一个光源&#xff0c;因为我们以及有一个立方体数据&#xff0c;我们只需要进行…

C语言从入门到熟悉------第四阶段

指针 地址和指针的概念 要明白什么是指针&#xff0c;必须先要弄清楚数据在内存中是如何存储的&#xff0c;又是如何被读取的。如果在程序中定义了一个变量&#xff0c;在对程序进行编译时&#xff0c;系统就会为这个变量分配内存单元。编译系统根据程序中定义的变量类型分配…

SIP调试之SIPP测试工具

SIPP是针对SIP协议的一个性能测试的命令行工具&#xff0c;可以动态显示测试的统计信息&#xff08;如呼叫速率、延时、消息统计等&#xff09;。用户可以通过XML场景配置文件&#xff0c;自定义模拟各种UAC/UAS测试场景的信令交互流程&#xff0c;可以被用来测试IP话机、SIP代…

pdf文件属性的删除

pdf文件属性的删除 投标过程中需要处理文件属性&#xff0c;特别是word文件属性以及pdf文件的处理 这里讲解pdf文件属性的处理 word处理在我的另外一个博客中&#xff0c;word文件属性的处理 https://ht666666.blog.csdn.net/article/details/134102504 一般用 adobe acroba…

八 超级数据查看器   讲解稿   详情3  分享和外观

八 超级数据查看器 讲解稿 详情3 分享和外观 app下载地址 下载地址4 ​ 讲解稿全文&#xff1a; 第3讲 分享 顶栏颜色 外观设置 现在讲解分享功能。点击&#xff0c;会打开分享对话框&#xff0c;我们这里演示2个&#xff0c;可以按照标题做出分享&#xff0c;在第一组…

异次元发卡源码系统/荔枝发卡V3.0二次元风格发卡网全开源源码

– 支付系统&#xff0c;已经接入易支付及Z支付免签接口。 – 云更新&#xff0c;如果系统升级新版本&#xff0c;你无需进行繁琐操作&#xff0c;只需要在你的店铺后台就可以无缝完成升级。 – 商品销售&#xff0c;支持商品配图、会员价、游客价、邮件通知、卡密预选&#…

数据库 | MYSQL这个复杂系统如何上手?

当你不知道从何入手研究或解决一个复杂系统的问题时&#xff0c;通常意味着你没有找到合适的切入点或者缺乏对系统整体和细节之间联系的理解。在这种情况下&#xff0c;一个有用的策略是寻找系统的基本原理或构成要素。 小时候&#xff0c;你可能也玩过玩具四驱车。有的四驱车…

Day44-sersync企业实时复制实战

Day44-sersync企业实时复制实战 1. sersync实时复制工具介绍1.1 sersync工具简介1.2 sersync特点1.3 sersync图解原理1.4 sersyncrsync实时复制方案项目实践1.4.1 图解项目方案架构及实现原理1.4.2 确保远程数据传输服务部署完成1.4.3 检查当前系统nfs01是否支持inotify实时监控…

数据结构之链式二叉树

当我们初步了解二叉树后 我们就可以进一步去深入学习二叉树了 1.链式二叉树的遍历 这里我们先去定义链式二叉树的结构 分为两个指针 一左一右 他们分别指向左子树和右子树 typedef int BTDataType;typedef struct BinaryTreeNode {BTDataType data;struct BinartTreeNod…

emment语法

文章目录 1. 生成普通的标签2. 生成 div类名3. 生成指定标签类名/id 值4. 生成带有子元素的标签5. 生成内部文本6. 一次可以生成多个标签7. 生成带有指定属性 的元素8. 生成相邻兄弟元素 1. 生成普通的标签 本质使用的就是元素选择器&#xff0c;例如 div p a 标签等等。 2. …

Machine Vision Technology:Lecture3 Edge detection | Fitting

Machine Vision Technology&#xff1a;Lecture3 Edge detection | Fitting Finite difference filters有限差分滤波器Effects of noise噪声对边缘检测影响Derivative theorem of convolution卷积的导数定理Derivative of Gaussian filter高斯滤波器的导数Smoothing vs. deriva…