Java设计模式 _行为型模式_解释器模式

一、解释器模式

1、解释器模式
解释器模式(Interpreter Pattern)是一种行为型模式。它提供了评估语言的语法或表达式的方式。通过实现了一个表达式接口,通常该接口解释一个特定且重复出现的问题。

2、实现思路
(1)、定义表达式的规范接口
(2)、编写表达式的各种实现类,可以内置不同的参数,实现该接口。
(3)、封装工具类,包装简单表达式到表达式类的映射关系

二、代码示例

1、示例场景
重新定义++,–,,//四个表达式的作用,分别为第一个参数操作第二个参数两次。
如:a++b,应该返回a+b+b的值;a
b,应该返回abb的值;

// 1、定义表达式规范
import java.math.BigDecimal;public abstract class Expression {abstract double interpret();double getValue(double num) {return new BigDecimal(num).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();}
}
// 2.1、编写基础规范,规定每一个操作元素的值为double类型两位小数
public class ValueExpression extends Expression {private double num;public ValueExpression(double num) {this.num = num;}@Overridepublic double interpret() {return getValue(num);   // 表达式的操作元素为保留两位小数的double类型}
}
// 2.2、编写++表达式的实现类
public class AddAddExpression extends Expression {private Expression left;private Expression right;public AddAddExpression(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic double interpret() {return getValue(left.interpret() + right.interpret() + right.interpret());}
}
// 2.3、编写--表达式的实现类
public class SubSubExpression extends Expression {private Expression left;private Expression right;public SubSubExpression(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic double interpret() {return getValue(left.interpret() - right.interpret() - right.interpret());}
}
// 2.4、编写**表达式的实现类
public class MulMulExpression extends Expression {private Expression left;private Expression right;public MulMulExpression(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic double interpret() {return getValue(left.interpret() * right.interpret() * right.interpret());}
}// 2.5、编写//表达式的实现类
public class DivDivExpression extends Expression {private Expression left;private Expression right;public DivDivExpression(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic double interpret() {if (Double.compare(right.interpret(),0.0)==0){System.out.println("0不能做除数");return 0;}return getValue(left.interpret() / right.interpret() / right.interpret());}
}
// 3、封装符号和表达式的工具类
public class ExpressionTool {public static  double compute(double left,double right,String operation){Expression leftValue = new ValueExpression(left);Expression rightValue = new ValueExpression(right);double result = 0;switch (operation){case "++":result= new AddAddExpression(leftValue,rightValue).interpret();break;case "--":result= new SubSubExpression(leftValue,rightValue).interpret();break;case "**":result= new MulMulExpression(leftValue,rightValue).interpret();break;case "//":result= new DivDivExpression(leftValue,rightValue).interpret();break;default:result = 0;}return result;}
}
// 4、测试
public static void main(String[] args) {double result = ExpressionTool.compute(8, 2, "++");System.out.println("8+2+2="+result);result = ExpressionTool.compute(8, 2, "--");System.out.println("8-2-2="+result);result = ExpressionTool.compute(8, 2, "**");System.out.println("8*2*2="+result);result = ExpressionTool.compute(8, 2, "//");System.out.println("8/2/2="+result);}

运行结果
在这里插入图片描述

总结:
解释器模式一般用于定义某些新的表达式类型,如:新的运算表达式。也可以是兼容一些语法上的使用,如翻译一些脚本的功能(js,python,shell)等。比较常用的如mybatis-plus中(对象直接操作.eq,.like,.or等方法去解释成对应的sql语言去执行)。一般不同业务场景下用到的还是比较少,具体还是看业务是否需要定义新的表达式规范再来确定是否使用这种设计模式吧。

学海无涯苦作舟!!!

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

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

相关文章

担心源代码泄露?五种有效的方式做到源代码加密防泄露!

对于软件开发公司来说,源代码是企业的核心财产,其安全性不容忽视。源代码泄露不仅可能导致技术秘密被窃取,还可能给企业带来法律纠纷和经济损失。因此,保护源代码的安全至关重要。本文将介绍五种有效的方式进行源代码保护&#xf…

一次完整的GC流程

Java堆中内存区分 Java的堆由新生代(Young Generation)和老年代(Old Generation)组成。新生代存放新分配的对象,老年代存放长期存在的对象。 新生代(Young)由年轻区(Eden&a…

macOS Sonoma 无法打开分段式Dmg文件的解决办法

在macOS Sonoma 14.X及更高版本的系统中,用户可能会遇到一个棘手的问题:无法直接打开“分段式”DMG(磁盘映像)安装包文件。这种情况通常发生在尝试安装一些大型软件或游戏时,尤其是那些因为文件体积巨大而采用分段压缩…

java项目之汽车资讯网站源码(springboot+mysql+vue)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的汽车资讯网站。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 汽车资讯网站的主要使用者管…

安卓微信聊天记录恢复

实验环境 微信8.0.49(最新版)小米手机(miui14)未rootU盘(可选) 导出聊天记录 因为手机没有root,因此是无法直接在文件管理中复制微信的聊天文件。这里我用小米自带的备份工具,将微…

如何使用 ArcGIS Pro 制作地震动画

在做某些汇报的时候,除了图文,如果有动画肯定会成为加分项,这里为大家介绍一下如何使用 ArcGIS Pro 制作地震动画,希望能对你有所帮助。 添加时间 在图层属性内,选择时间选项卡,图层时间选择每个要素具有…

01面向类的讲解

指针指向类成员使用 代码&#xff1a; #include<iostream> using namespace std;class Test { public:void func() { cout << "call Test::func" << endl; }static void static_func();int ma;static int mb; //不依赖对象 }; void Test::static…

深入理解线程的两阶段终止模式:确保线程安全退出

序言 在多线程编程中&#xff0c;线程的安全退出是一个重要的问题。在实际应用中&#xff0c;我们经常需要确保线程在退出时能够完成必要的清理工作&#xff0c;同时避免因资源泄漏或状态不一致而导致的问题。线程的两阶段终止模式是一种解决这个问题的有效方法。本文将深入探…

推荐——通配符SSL证书该怎么申请?在哪里可以申请?

JoySSL是网盾安全基于全球可信顶级根创新推出的新一代https数字证书&#xff0c;也是目前为数不多的中国自主品牌SSL证书。JoySSL携手全球权威CA机构&#xff0c;全球多节点服务器验证签发&#xff0c;安全可信、完美兼容且更加稳定快速。JoySSL品牌提供通配符等证书所有适配范…

python之并发编程

python之并发编程 线程的创建方式线程的创建方式(方法包装)线程的创建方式(类包装)join()【让主线程等待子线程结束】守护线程【主线程结束&#xff0c;子线程就结束】 锁多线程操作同一个对象(未使用线程同步)多线程操作同一个对象(增加互斥锁&#xff0c;使用线程同步)死锁案…

SSIM(Structural Similarity),结构相似性及MATLAB实现

参考文献 Wang, Zhou; Bovik, A.C.; Sheikh, H.R.; Simoncelli, E.P. (2004-04-01). “Image quality assessment: from error visibility to structural similarity”. IEEE Transactions on Image Processing. 13 (4): 600–612. Bibcode:2004ITIP…13…600W. CiteSeerX 10.…

数字型隔离器ISO121x的用法

目录 概述 1 认识ISO121x 1.1 简介 1.2 特性 1.3 应用领域 2 ISO121x芯片结构 2.1 ISO1211引脚介绍 2.2 ISO1211的通用应用电路 2.3 Layout Example 3 应用范例 3.1 TI提供的评估板 3.2 评估板的原理图电路 概述 本文主要介绍ISO121x的相关特性&#xff0c;以及其…