当前位置: 首页 > news >正文

行为型模式-解释器模式

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

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

主要解决:对于一些固定文法构建一个解释句子的解释器。

何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

如何解决:构建语法树,定义终结符与非终结符。

关键代码:构建环境类,包含解释器之外的一些全局信息,一般是 HashMap。

应用实例:编译器、运算表达式计算。

优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。

缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法。

使用场景: 1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。 2、一些重复出现的问题可以用一种简单的语言来进行表达。 3、一个简单语法需要解释的场景。

注意事项:可利用场景比较少,JAVA 中如果碰到可以用 expression4J 代替。

public interface Expression {boolean interpret(String context);
}
@AllArgsConstructor
public class AndExpression implements Expression{private Expression expr1 = null;private Expression expr2 = null;@Overridepublic boolean interpret(String context) {return expr1.interpret(context) && expr2.interpret(context);}
}
@AllArgsConstructor
public class OrExpression implements Expression{private Expression expr1 = null;private Expression expr2 = null;@Overridepublic boolean interpret(String context) {return expr1.interpret(context) || expr2.interpret(context);}
}
@AllArgsConstructor
public class TerminalExpression implements Expression{private String data;@Overridepublic boolean interpret(String context) {if (context.contains(data)){return true;}return false;}
}
    @Testpublic void test10(){Expression isMale = getMaleExpression();Expression isMarriedWoman = getMarriedWomanExpression();System.out.println("John is male? " + isMale.interpret("John"));System.out.println("Julie is a married women? "+ isMarriedWoman.interpret("Married Julie"));}//规则:Robert 和 John 是男性private static Expression getMaleExpression(){Expression robert = new TerminalExpression("Robert");Expression john = new TerminalExpression("John");return new OrExpression(robert, john);}//规则:Julie 是一个已婚的女性private static Expression getMarriedWomanExpression(){Expression julie = new TerminalExpression("Julie");Expression married = new TerminalExpression("Married");return new AndExpression(julie, married);}//John is male? true
//Julie is a married women? true

http://www.lryc.cn/news/175405.html

相关文章:

  • Linux系统编程(五):信号
  • 学习路之工具--SecureCRT的下载、安装
  • 软件定义网络-OpenvSwitch
  • Android Update Engine 分析(二十三)如何在升级后清除用户数据?
  • 分享从零开始学习网络设备配置--任务3.7 使用动态路由RIPv2实现网络连通
  • 游戏录屏软件推荐,教你录制高清游戏视频
  • 四川眼科医院孙丰源教授团队为患者拔除1.4cm长“眼中钉”
  • PHP 初学 GO 学习笔记
  • 前端制作
  • 扩散模型:DDPM代码的学习(基于minist数据集)
  • 小程序-uniapp:URL Link / 适用于在移动端 从短信、邮件、微信外网页 等场景打开小程序任意页面
  • 干货 | 基于在线监控数据的非现场监管问题识别模型研究
  • Spring Cloud Alibaba Gateway 简单使用
  • 两种fifo实现方式的差异
  • 孜然单授权系统V1.0[免费使用]
  • kubernetes问题(一)-异常事件
  • Android Jetpack组件架构 :LiveData的使用和原理
  • 【学习笔记】Prufer序列
  • 由于找不到msvcr110.dll的5种解决方法
  • 最长连续递增子序列
  • Java学习星球,十月集训,五大赛道(文末送书)
  • 前端VUE---JS实现数据的模糊搜索
  • Android Studio 的android.jar文件在哪儿
  • Elasticsearch 部署学习
  • nodejs 如何在npm发布自己的包 <记录>
  • 移植RTOS的大体思路
  • FPGA到底是什么?
  • 算法-单词搜索 II
  • 怒刷LeetCode的第15天(Java版)
  • Android开发MVP架构记录