【设计模式】解释器模式
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
介绍
意图:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
主要解决:对于一些固定文法构建一个解释句子的解释器。
何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
如何解决:构件语法树,定义终结符与非终结符。
关键代码:构件环境类,包含解释器之外的一些全局信息,一般是 HashMap。
应用实例:编译器、运算表达式计算。
优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。
缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法。
使用场景: 1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。 2、一些重复出现的问题可以用一种简单的语言来进行表达。 3、一个简单语法需要解释的场景。
注意事项:可利用场景比较少,JAVA 中如果碰到可以用 expression4J 代替。
实现
我们将创建一个接口 Expression 和实现了 Expression 接口的实体类。定义作为上下文中主要解释器的 TerminalExpression 类。其他的类 OrExpression、AndExpression 用于创建组合式表达式。
InterpreterPatternDemo,我们的演示类使用 Expression 类创建规则和演示表达式的解析。
步骤 1
创建一个表达式接口。
public interface Expression {public boolean interpret(String context); }
步骤 2
创建实现了上述接口的实体类。
public class TerminalExpression implements Expression {private String data;public TerminalExpression(String data){this.data = data; }@Overridepublic boolean interpret(String context) {if(context.contains(data)){return true;}return false;} }
public class OrExpression implements Expression {private Expression expr1 = null;private Expression expr2 = null;public OrExpression(Expression expr1, Expression expr2) { this.expr1 = expr1;this.expr2 = expr2;}@Overridepublic boolean interpret(String context) { return expr1.interpret(context) || expr2.interpret(context);} }
public class AndExpression implements Expression {private Expression expr1 = null;private Expression expr2 = null;public AndExpression(Expression expr1, Expression expr2) { this.expr1 = expr1;this.expr2 = expr2;}@Overridepublic boolean interpret(String context) { return expr1.interpret(context) && expr2.interpret(context);} }
步骤 3
InterpreterPatternDemo 使用 Expression 类来创建规则,并解析它们。
public class InterpreterPatternDemo {//规则:Robert 和 John 是男性public static Expression getMaleExpression(){Expression robert = new TerminalExpression("Robert");Expression john = new TerminalExpression("John");return new OrExpression(robert, john); }//规则:Julie 是一个已婚的女性public static Expression getMarriedWomanExpression(){Expression julie = new TerminalExpression("Julie");Expression married = new TerminalExpression("Married");return new AndExpression(julie, married); }public static void main(String[] args) {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"));} }
步骤 4
验证输出。
John is male? true Julie is a married women? true
【设计模式】解释器模式相关推荐
- Python设计模式-解释器模式
Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...
- 设计模式 | 解释器模式及典型应用
微信原文:设计模式 | 解释器模式及典型应用 博客原文:设计模式 | 解释器模式及典型应用 本文主要介绍解释器模式,在日常开发中,解释器模式的使用频率比较低 解释器模式 解释器模式(Interpret ...
- 解释器android,Android的设计模式-解释器模式
前言 Android的设计模式系列文章介绍,欢迎关注,持续更新中: 1.定义 给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 2.介绍 解释器模式属于行 ...
- C++设计模式-解释器模式
目录 基本概念 代码与实例 基本概念 解释器模式(interpreter):给定一个语言,定义他的文法的一种表示,并定义一个解释器,这个解释器应该使用该表示来解释语言中的句子. 如果一种特定类型的问题 ...
- 深入浅出设计模式——解释器模式(Interpreter Pattern)
模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题. 解释器模式描述了如何构成一 ...
- PHP设计模式——解释器模式
声明:本系列博客参考资料<大话设计模式>,作者程杰. 解释器模式:Given a language, define arepresentation for its grammar alon ...
- 初识设计模式 - 解释器模式
简介 在某些情况下,为了更好地描述某一些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则. 解释器设计模式(Interpreter Design Pattern)描 ...
- C++设计模式——解释器模式(interpreter pattern)
一.原理讲解 1.1意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 1.2应用场景 文法简单.对于复杂的文法,文法的类层次变得庞大而无法管理:此 ...
- Java设计模式--解释器模式
解释器模式 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. Interpreter Pattern Given a language, define ...
- 设计模式——解释器模式
名称 Interpreter 结构 意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 适用性 当有 1// Interpreter 2 ...
最新文章
- Oracle动态采样学习
- Ext.widgets-Button,SplitButton,CycleButton
- SAP Spartacus Definition of Done
- linux 内核3.8,[Beaglebone] BBB迁移到linux 3.8实时内核
- Linux使用tcpdump抓获取WIFI包
- python采集直播间数据_Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例...
- 安装使用反编译工具ILSPY
- 网络安全术语基础知识
- Windows 应用生成MiniDump文件的方法笔记
- bootstrap-treeview树形图参数详解
- java读取tif文件_java读取TIF,TIFF文件方法
- windows禅道环境搭建
- Web服务器Nginx
- YouTube直播SDK集成(一)
- 2018年列车已到站,请您下车
- 人力资源总监面试时是怎么想的?
- 【BZOJ3837】[Pa2013]Filary 随机化神题
- Windows系统下批量重命名文件(超详细操作讲解)
- ps图片拖不进去_ps不能直接把图片拖进去怎么办
- 【FPGA】8B/10B编码--转自wiki百科
热门文章
- linux中安装wine运行windows程序
- python log文件处理_Python 处理大Log文件
- 压力测试网站_JMeter简单压力测试教程
- 怎么设置qq信息同步服务器,王者荣耀QQ消息同步功能是什么 王者荣耀QQ消息同步功能介绍...
- Harmony OS — TabList和Tab分页栏
- linux - mysql 异常:Ignoring query to other database
- 【UOJ #351】新年的叶子(树的直径,期望)
- socket 网络编程高速入门(一)教你编写基于UDP/TCP的服务(client)通信
- Jmeter学习笔记ONE
- 使用JSON作为函数的参数(转载)