【Java设计模式】简单学解释器模式——加减乘除
目录
说明
实现方式
应用场景
其他链接
说明
- 行为型模式之一,其他还有命令模式、模板方法模式、访问者模式、观察者模式、中介者模式、备忘录模式、迭代器模式、状态模式、策略模式、职责链模式(责任链模式)
- 解释器模式(Interpreter Pattern):给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式)
- 使用解释器可能带来的问题:解释器模式会引起类膨胀、解释器模式采用递归调用方法,将会导致调试非常复杂、效率可能降低
- 如果一个特定类型的问题发生的频率足够高,那么可能值得为该问题的各个实例表述为一个简单语言的句子。这样就可以构建一个解释器,通过解释这些句子来解决问题。
实现方式
以加减乘除为例
public class InterpreterTest {public static void main(String[] args) {Context context = new Context();// 变量赋值context.addValue("a", 6);context.addValue("b", 9);context.addValue("c", 1);// 创建变量(终结表达式)Variable a = new Variable("a");Variable b = new Variable("b");Variable c = new Variable("c");// 先拼接表达式// a×bAbstractExpression multiplyValue = new Multiply(a, b);// a-b+cAbstractExpression addValue = new Add(new Subtract(a, b), c);// (a*b)/(a-b+c)AbstractExpression divisionValue = new Division(multiplyValue, addValue);// 展示变量以及代表的值System.out.println(context.getValueMap());// 展示将表达式解释出来的结果System.out.println("(a*b)/(a-b+c) = " + divisionValue.interpreter(context));}
}/*** 抽象解释器* <p>** @author : ZRH* @version : 1.0.0* @date : 2020-07-24*/
abstract class AbstractExpression {/*** 解释结果* <p>** @param context* @return java.lang.Integer* @author : ZRH* @version : 1.0.0* @date : 2020-07-24*/public abstract Integer interpreter(Context context);
}/*** 非终结表达式:加法* <p>** @author ZRH* @version 1.0.0* @date 2020/7/24*/
class Add extends AbstractExpression {private final AbstractExpression left;private final AbstractExpression right;public Add(AbstractExpression left, AbstractExpression right) {this.left = left;this.right = right;}@Overridepublic Integer interpreter(Context context) {return left.interpreter(context) + right.interpreter(context);}
}/*** 非终结表达式:减法* <p>** @author ZRH* @version 1.0.0* @date 2020/7/24*/
class Subtract extends AbstractExpression {private final AbstractExpression left;private final AbstractExpression right;public Subtract(AbstractExpression left, AbstractExpression right) {this.left = left;this.right = right;}@Overridepublic Integer interpreter(Context context) {return left.interpreter(context) - right.interpreter(context);}
}/*** 非终结表达式:乘法* <p>** @author ZRH* @version 1.0.0* @date 2020/7/24*/
class Multiply extends AbstractExpression {private final AbstractExpression left;private final AbstractExpression right;public Multiply(AbstractExpression left, AbstractExpression right) {this.left = left;this.right = right;}@Overridepublic Integer interpreter(Context context) {return left.interpreter(context) * right.interpreter(context);}
}/*** 非终结表达式:除法* <p>** @author ZRH* @version 1.0.0* @date 2020/7/24*/
class Division extends AbstractExpression {private final AbstractExpression left;private final AbstractExpression right;public Division(AbstractExpression left, AbstractExpression right) {this.left = left;this.right = right;}@Overridepublic Integer interpreter(Context context) {int right = this.right.interpreter(context);if (right != 0) {return left.interpreter(context) / right;}return -1;}
}/*** 终结表达式:变量* <p>** @author ZRH* @version 1.0.0* @date 2020/7/24*/
class Variable extends AbstractExpression {private final String key;public Variable(String key) {this.key = key;}@Overridepublic Integer interpreter(Context context) {return context.getValue(key);}
}/*** 环境上下文* <p>** @author ZRH* @version 1.0.0* @date 2020/7/24*/
class Context {/*** 存储变量以及代表的值,比如a = 3*/private final Map<String, Integer> valueMap = new HashMap<>();public Map<String, Integer> getValueMap() {return valueMap;}public void addValue(final String key, final int value) {valueMap.put(key, Integer.valueOf(value));}public int getValue(final String key) {return valueMap.get(key).intValue();}
}
应用场景
将一个需要解释执行的语言中的句子表示为一个抽象语法树
一些重复出现的问题可以用一种简单的语言来表达
一个简单语法需要解释的场景
编译器
运算表达式计算
正则表达式
机器人
其他链接
【Java设计模式】简单学工厂模式
【Java设计模式】简单学抽象工厂模式
【Java设计模式】简单学建造者模式
【Java设计模式】简单学单例模式
【Java设计模式】简单学原型模式
【Java设计模式】其他模式~
【Java设计模式】简单学解释器模式——加减乘除相关推荐
- Java设计模式学习记录-解释器模式
前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...
- 【Java设计模式】简单学访问者模式——我的选择是,Yes
目录 说明 实现方式 优点 缺点 应用场景 其他链接 说明 行为型模式之一,其他还有命令模式.模板方法模式.迭代器模式.观察者模式.中介者模式.备忘录模式.解释器模式(Interpreter模式).状 ...
- 【Java设计模式】简单学外观模式——万能遥控器
目录 说明 目标 实现方式 注意事项 其他链接 说明 结构型模式之一,其他还有适配器模式.桥接模式.组合模式.装饰模式.享元模式.代理模式 外观模式(Facade Pattern)通过定义一个一致的接 ...
- 【Java设计模式】简单学桥接模式——来杯大杯加奶不加糖咖啡
目录 说明 目标 实现方式 应用场景 其他链接 说明 结构型模式之一,其他还有适配器模式.装饰模式.组合模式.外观模式.享元模式.代理模式 目标 用抽象关联取代了多层继承,将类之间的静态继承关系转换为 ...
- Java进阶篇设计模式之九----- 解释器模式和迭代器模式
前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...
- Java设计模式之责任链模式(简单易懂)
前言: 责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿 ...
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- java设计模式适配器模式_Java解释器设计模式
java设计模式适配器模式 Interpreter design pattern is one of the behavioral design pattern. Interpreter patter ...
- java设计模式3种工厂模式
java设计模式3种工厂模式 2010-01-08 16:06:36| 分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...
最新文章
- android wifi定位服务,如何在Android中使用Wifi获取位置?
- (转)OOP(面向对象编程)的几大原则
- python预测数据怎么写_Python代写时间序列选择波动率预测指数收益算法分析案例...
- ggplot2 | 统计变换的初步理解
- delphi7IDE技巧
- HTML设置自动跳转后无反应,实际项目中html跳转无响应原因及解决方案总结
- 概率论中经典概率模型
- android re浏览器下载,RE文件浏览器
- wifi信号增强android,WiFi信号增强放大器
- 利用Power BI制作分级地图报表
- python中字典的定义和操作
- 详解深度学习中的梯度消失、爆炸原因及其解决方法
- Java语言十五讲(第十四讲 容器框架二)
- 老照片瞬间修复神器!快帮你家的长辈恢复照片去吧
- OSI七层模型——数据链路层
- 每日一句api Android,Android 图文数据JSON解析,金山词霸每日一句API的调用
- 3dsmax2014安装激活之 “软件许可证检出失败 错误20”或者显示错误5。
- Html id 选择器
- 使用Larave5.6l提交POST请求出现The page has expired due to inactivity错误
- 异步书讯:7月有这样7本程序员新书上架