设计模式(二十二)------23种设计模式(14):解释器模式

使用频率:★☆☆☆☆

一、什么是解释器模式

定义一些语法规则,然后定义一个解析器去解析该语法;

所谓解释器模式就是定义语言的文法,并且建立一个解释器来解释该语言中的句子。

      在这里我们将语言理解成使用规定格式和语法的代码。

      在前面我们知道可以构建解释器来解决那些频繁发生的某一特定类型的问题,在这我们将这些问题的实例表述为一个语言中句子。例如我经常利用正则表达式来检测某些字符串是否符合我们规定的格式。这里正则表达式就是解释器模式的应用,解释器为正则表达式定义了一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式。

      解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中。它描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。


二、补充说明

该模式极少使用,简单了解下吧~

三、角色(以加减法解析为例)

抽象表达式类

末端表达式类:数字变量

非末端表达式:+-操作

环境角色:存一些变量。。。

客户端

四、例子,JAVA实现逆波兰表达式的解释器

参考维基百科例子

一个解析加减法语法规则的例子

抽象表达式类、以及末端表达式类和非末端表达式类

复制代码
package com.pichen.dp.behavioralpattern.interpreter;import java.util.Map;public interface Expression {public int interpret(Map<String, Expression> variables);
}class Number implements Expression {private int number;public Number(int number) {this.number = number;}public int interpret(Map<String, Expression> variables) {return number;}
}class Plus implements Expression {Expression leftOperand;Expression rightOperand;public Plus(Expression left, Expression right) {leftOperand = left;rightOperand = right;}public int interpret(Map<String, Expression> variables) {return leftOperand.interpret(variables) + rightOperand.interpret(variables);}
}class Minus implements Expression {Expression leftOperand;Expression rightOperand;public Minus(Expression left, Expression right) {leftOperand = left;rightOperand = right;}public int interpret(Map<String, Expression> variables) {return leftOperand.interpret(variables) - rightOperand.interpret(variables);}
}class Variable implements Expression {private String name;public Variable(String name) {this.name = name;}public int interpret(Map<String, Expression> variables) {if (null == variables.get(name))return 0; // Either return new Number(0).return variables.get(name).interpret(variables);}
}
复制代码
复制代码
package com.pichen.dp.behavioralpattern.interpreter;import java.util.Map;
import java.util.Stack;public class Evaluator implements Expression {private Expression syntaxTree;public Evaluator(String expression) {Stack<Expression> expressionStack = new Stack<Expression>();for (String token : expression.split(" ")) {if (token.equals("+")) {Expression subExpression = new Plus(expressionStack.pop(), expressionStack.pop());expressionStack.push(subExpression);} else if (token.equals("-")) {// it's necessary remove first the right operand from the stackExpression right = expressionStack.pop();// ..and after the left oneExpression left = expressionStack.pop();Expression subExpression = new Minus(left, right);expressionStack.push(subExpression);} elseexpressionStack.push(new Variable(token));}syntaxTree = expressionStack.pop();}public int interpret(Map<String, Expression> context) {return syntaxTree.interpret(context);}
}
复制代码

客户端角色,包含环境角色,直接写在main函数里面了

复制代码
package com.pichen.dp.behavioralpattern.interpreter;
import java.util.Map;
import java.util.HashMap;public class InterpreterExample {public static void main(String[] args) {String expression = "w x z - +"; //这个逆波兰表达式解释后就是 (x-z)+wEvaluator sentence = new Evaluator(expression);Map<String,Expression> variables = new HashMap<String,Expression>();variables.put("w", new Number(5));variables.put("x", new Number(10));variables.put("z", new Number(42));int result = sentence.interpret(variables);System.out.println(result);}
}
复制代码

结果打印:-27

 


@Author      风一样的码农
@HomePageUrl http://www.cnblogs.com/chenpi/ 
@Copyright      转载请注明出处,谢谢~ 

转载于:https://www.cnblogs.com/chz-blogs/p/9380965.html

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

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

相关文章

7 win 卸载node_node怎么卸载?Windows卸载node方法

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;很多开发的朋友都在电脑上安装了node&#xff0c;那么如何卸载呢&#xff1f;很多用户可能不是很清楚&#xff0c;并且要卸载干净无残留&#xff0c;下面一起来看看小编分享的方法吧。Node卸载步骤如下&am…

使用jclouds库在Amazon S3上上传

在Java世界中&#xff0c;有几种将内容上载到S3存储桶的好方法–在本文中&#xff0c;我们将研究jclouds库为此提供的功能。 要使用jclouds –特别是本文中讨论的API&#xff0c;应将这种简单的Maven依赖项添加到项目的pom中&#xff1a; <dependency><groupId>or…

【HTML】前端性能优化之CDN和WPO的比较

CDN通过将资源存储在更接近用户的位置&#xff0c;缩短到服务器的往返行程&#xff0c;加快页面加载时间来解决性能问题。WPO解决方案&#xff0c;如Radware的FastView&#xff0c;则在前端进行性能提升处理&#xff0c;使页面更有效地呈现在浏览器中。 “我已经使用了内容交付…

python自动化测试-D1-学习笔记之二

Jmeter 一、Jmeter连接数据库 1、打开Jmeter&#xff0c;在Jmeter—测试计划中添加mysql的jar包&#xff0c;见如下截图&#xff1a; 2、添加好jar包后&#xff0c;添加jdbc&#xff0c;并进行设置&#xff0c;如下图 3、添加JDBC Request&#xff0c;然后在JDBC Request中操作…

Android View 的滑动

一、View 的简介 View是所有可视化控件的基类&#xff0c;我们平时接触的所有的控件&#xff0c;比如说TextView,Button 等等都继承于View。View是Android 在视觉上的呈现&#xff0c;是界面层控件的一种抽象&#xff0c;可以是单个控件也可以是一组控件。 二、坐标系 1、Andro…

ActiveMQ消息优先级:工作原理

关于ActiveMQ的消息优先级支持 &#xff0c; 邮件列表上通常会不断出现一些问题&#xff0c;以及有关观察到的行为和“真正支持什么”的好问题&#xff1f; 我希望可以帮助您了解幕后情况以及可以支持的优先级。 详细信息可能会有些麻烦。 如果您对这些细节不感兴趣&#xff0c…

flask 检测post是否为空_使用Flask搭建一个校园论坛-4

在上一节中完成了注册功能的前期准备工作&#xff0c;在这一节内容中将完成用户注册、登录功能。1.知识预览在本届中将学习到以下内容的知识如何使用wtform来渲染表单如果使用flask-mail来发送邮件2.用户注册在前端中form表单是用的比较多的东西&#xff0c;我们可以使用wtform…

SQL Table 自动生成Net底层-生成数据操作Repository

生成接口类 public static string DataTableToBaseIService(string tableName, string nameSpace, string className){var table SqlTableHelper.GetSQLTableInfo(tableName);StringBuilder reval new StringBuilder();reval.AppendFormat(" using System; using…

CSS3扁平化Loading动画特效

效果预览&#xff1a;http://hovertree.com/texiao/css3/42/ 代码如下&#xff1a; <!doctype html><html><head><meta charset"utf-8"><title>css3旋转加载效果_何问起</title><style>body {background: #263238;backgro…

自定义Spring命名空间使JAXB更容易

首先&#xff0c;让我大声说出来&#xff1a; Spring不再是XML繁重的了 。 事实上&#xff0c;如今&#xff0c;您可以使用大量注释&#xff0c; Java配置和Spring Boot来编写几乎没有XML或根本没有XML的Spring应用程序。 认真地停止谈论Spring和XML&#xff0c;这已经成为过去…

sublime text3运行python不显示内容_sublime text 运行python无法出结果

一、python和sublime text 已经安装完毕。二、用sublime text运行python程序得时候出现三、配置Python环境1、打开Tools > Build System > New Build System..2、点击New Build System后&#xff0c;会生成一个空配置文件&#xff0c;在这个配置文件内覆盖配置信息&#…

利用锚点再点事吧丨

上图 接着HTML代码&#xff1a; <div id"color"> <div id"red">红</div> <div id"yellow">黄</div> <div id"black">黑</div> <div id"green">绿</div> </div>…

JavaScript变量声明与提升

一直以来对变量提升都是比较模糊的&#xff0c;今天特地看了一下这个知识点&#xff0c;总结一下。 1、举个最简单的例子来说一下什么是变量提升吧。  function foo(){console.log(x); // undefinedvar x 12;console.log(x) // 12 } foo(); 由于变量声明提升&#xff0c;其…

javaweb笔记1

转载于:https://www.cnblogs.com/webdev8888/p/9164291.html

重复运行JUnit测试而没有循环

最近&#xff0c;我遇到了一个问题&#xff0c;我不得不编写一种方法的测试&#xff0c;该方法需要计算在一定可能性范围内的随机分布值1 。 更准确地说&#xff0c;如果您假设签名看起来像 interface RandomRangeValueCalculator {long calculateRangeValue( long center, lo…

以太网数据帧的报尾封装字段是什么_16、90秒快速“读懂”数据包的封装、解封装...

数据转发过程概述数据包在相同网段内或不同网段之间转发所依据的原理基本一致。一、数据帧封装TCP封装(四层)当主机建立了到达目的地的TCP连接后&#xff0c;便开始对应用层数据进行封装。主机A会对待发送的应用数据首先执行加密和压缩等相关操作&#xff0c;之后进行传输层封装…

MVP模式在Android实际项目中的应用和优化

注&#xff1a;本文阅读需要对MVP模式有基本了解。 MVP模式已经出现有很长一段时间了&#xff0c;但是火起来是这两年的事情。 关于MVP的概览&#xff0c;介绍&#xff0c;乃至于教程&#xff0c;Demo&#xff0c;实例&#xff0c;网上都有很多&#xff0c;我也有一篇文章专门收…

将训练集构建成ImageNet模型

以下程序实现将训练集构建为ImageNet模型&#xff0c;训练集图片为56个民族 import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter;public class createTxt {public static void createClassInd(){//56个…

CSS基本知识(慕课网)

1、注释 注解&#xff1a;CSS中注释/*这里是注释的文字*/ HTML中注释<!--这里是注释的文字--> 2、外部式css样式&#xff0c;写在单独的一个文件中 注解&#xff1a; 外部式css样式(也可称为外联式)就是把css代码写一个单独的外部文件中&#xff0c;这个css样式文件以“…

JMS和Spring:有时很重要的小事情

JmsTemplate和DefaultMessageListenerContainer是用于访问JMS兼容MOM的Spring帮助器。 他们的主要目标是在JMS API之上形成一层&#xff0c;并处理诸如事务管理/消息确认之类的基础结构&#xff0c;并隐藏JMS API的某些重复和笨拙的部分&#xff08;保留在那里&#xff1a; JMS…