目录

说明

实现方式

应用场景

其他链接


说明

  • 行为型模式之一,其他还有命令模式、模板方法模式、访问者模式、观察者模式、中介者模式、备忘录模式、迭代器模式、状态模式、策略模式、职责链模式(责任链模式)
  • 解释器模式(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设计模式】简单学解释器模式——加减乘除相关推荐

  1. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  2. 【Java设计模式】简单学访问者模式——我的选择是,Yes

    目录 说明 实现方式 优点 缺点 应用场景 其他链接 说明 行为型模式之一,其他还有命令模式.模板方法模式.迭代器模式.观察者模式.中介者模式.备忘录模式.解释器模式(Interpreter模式).状 ...

  3. 【Java设计模式】简单学外观模式——万能遥控器

    目录 说明 目标 实现方式 注意事项 其他链接 说明 结构型模式之一,其他还有适配器模式.桥接模式.组合模式.装饰模式.享元模式.代理模式 外观模式(Facade Pattern)通过定义一个一致的接 ...

  4. 【Java设计模式】简单学桥接模式——来杯大杯加奶不加糖咖啡

    目录 说明 目标 实现方式 应用场景 其他链接 说明 结构型模式之一,其他还有适配器模式.装饰模式.组合模式.外观模式.享元模式.代理模式 目标 用抽象关联取代了多层继承,将类之间的静态继承关系转换为 ...

  5. Java进阶篇设计模式之九----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

  6. Java设计模式之责任链模式(简单易懂)

    前言: 责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿 ...

  7. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  8. java设计模式适配器模式_Java解释器设计模式

    java设计模式适配器模式 Interpreter design pattern is one of the behavioral design pattern. Interpreter patter ...

  9. java设计模式3种工厂模式

    java设计模式3种工厂模式 2010-01-08 16:06:36|  分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...

最新文章

  1. android wifi定位服务,如何在Android中使用Wifi获取位置?
  2. (转)OOP(面向对象编程)的几大原则
  3. python预测数据怎么写_Python代写时间序列选择波动率预测指数收益算法分析案例...
  4. ggplot2 | 统计变换的初步理解
  5. delphi7IDE技巧
  6. HTML设置自动跳转后无反应,实际项目中html跳转无响应原因及解决方案总结
  7. 概率论中经典概率模型
  8. android re浏览器下载,RE文件浏览器
  9. wifi信号增强android,WiFi信号增强放大器
  10. 利用Power BI制作分级地图报表
  11. python中字典的定义和操作
  12. 详解深度学习中的梯度消失、爆炸原因及其解决方法
  13. Java语言十五讲(第十四讲 容器框架二)
  14. 老照片瞬间修复神器!快帮你家的长辈恢复照片去吧
  15. OSI七层模型——数据链路层
  16. 每日一句api Android,Android 图文数据JSON解析,金山词霸每日一句API的调用
  17. 3dsmax2014安装激活之 “软件许可证检出失败 错误20”或者显示错误5。
  18. Html id 选择器
  19. 使用Larave5.6l提交POST请求出现The page has expired due to inactivity错误
  20. 异步书讯:7月有这样7本程序员新书上架

热门文章

  1. 又一 VSCode 神器诞生!
  2. MySQL之自带四库之information_schema库
  3. Linux系统中“动态库”和“静态库”那点事儿【转】
  4. 一图胜千言!八个小诀窍帮你玩转网站背景图设计
  5. 阿里云天池龙珠计划SQL训练营——Day2
  6. Java 第十一届 蓝桥杯 省模拟赛 梅花桩
  7. 操作系统实验2---进程管理(更完..)
  8. 零数科技荣获2022金融科技创新引领奖
  9. 【2019-09-27】哭又有什么用
  10. [转]仿京东商城,一号店商品多级分类精美菜单