设计模式之 Interpreter(解释器) 通俗理解
23种设计模式
1 Interpreter定义:
定义语言的文法 ,并且建立一个解释器来解释该语言中的句子。通俗来讲就是定义一套规则,然后有个工具类,根据你传入的参数就知道你表达的意思。
Interpreter 似乎使用面不是很广,它描述了一个语言解释器是如何构成的。
2 如何使用?
举例 计算器的实现
package xx.study.design.interpreter;public class IterpreterDemo {public static void main(String[] args) {ParserInterpreter interpreter = new ParserInterpreter();double result = interpreter.calculate("2*(3+1+1)-4*2+3");System.out.println("计算结果为: " + result);}}
package xx.study.design.interpreter;/*** 定义Interpreter接口*/
public interface Interpreter {double calculate(String expression);
}package xx.study.design.interpreter;import java.util.LinkedList;/*** 解析器,构造语法树***/
public class ParserInterpreter implements Interpreter {public double calculate(String expression) { //1 * (2 + 3)StringBuilder number = new StringBuilder();LinkedList<Interpreter> interpreters = new LinkedList<Interpreter>();LinkedList<Character> operators = new LinkedList<Character>();for (char ch : expression.toCharArray()) {if (isOperator(ch)) {//将之前的数字入栈if (number.length() > 0) {interpreters.add(new Number(Double.parseDouble(number.toString())));number.setLength(0);}//组装表达式while (interpreters.size() >= 2) {Character lastOp = operators.getLast();//碰到左括号if (isOpenParen(lastOp)) {break;}//碰到了运算符,但下一个运算符优先级是否更高?if (rightOperatorGreater(lastOp, ch)) {break;}Interpreter right = interpreters.removeLast();Interpreter left = interpreters.removeLast();Interpreter interpreter = constructExpression(left,operators.removeLast(), right);interpreters.addLast(interpreter);}if (isCloseParen(ch)) {//碰到右括号,直接去掉左括号operators.removeLast();} else {//非右括号,直接进栈operators.addLast(ch);}} else {number.append(ch);}}//最后是数字,如1*2+3if (number.length() > 0) {interpreters.add(new Number(Double.parseDouble(number.toString())));number.setLength(0);}//最后一次运算if (operators.size() > 0) {Interpreter right = interpreters.removeLast();Interpreter left = interpreters.removeLast();Interpreter interpreter = constructExpression(left,operators.removeLast(), right);interpreters.addLast(interpreter);}//调用组装好的树return interpreters.pop().calculate(expression);}/*** 右边运算符是否优先级更高* @param leftOp* @param rightOp* @return*/private boolean rightOperatorGreater(char leftOp, char rightOp) {if (rightOp == '*' || rightOp == '/') {return leftOp == '+' || leftOp == '-';}return false;}private boolean isOperator(char ch) {return ch == '-' || ch == '+' || ch == '/' || ch == '*' || ch == '(' || ch ==')';}private boolean isOpenParen(char ch) {return ch == '(';}private boolean isCloseParen(char ch) {return ch == ')';}private Interpreter constructExpression(Interpreter left, char op, Interpreter right) {switch (op) {case '+' :return new Add(left, right);case '*' :return new Multiply(left, right);case '-' :return new Minus(left, right);case '/' :return new Divide(left, right);default:break;}return null;}}
package xx.study.design.interpreter;public class Number implements Interpreter {private double number;public Number(double number) {super();this.number = number;}public double calculate(String expression) {return number;}}
package xx.study.design.interpreter;/*** 实现加法操作,注意这里组合了其他的Interpreter对象,而不是直接操作数字。* left和right即可能是数字,也可能是其他的操作。*/
public class Add implements Interpreter {private Interpreter left;private Interpreter right;public Add(Interpreter left, Interpreter right) {this.left = left;this.right = right;}public double calculate(String expression) {return left.calculate(expression) + right.calculate(expression);}}
package xx.study.design.interpreter;/*** 实现减法操作,注意这里组合了其他的Interpreter对象,而不是直接操作数字。* left和right即可能是数字,也可能是其他的操作。*/
public class Minus implements Interpreter {private Interpreter left;private Interpreter right;public Minus(Interpreter left, Interpreter right) {this.left = left;this.right = right;}public double calculate(String expression) {return left.calculate(expression)-right.calculate(expression);}}
package xx.study.design.interpreter;/*** 实现乘法操作,注意这里组合了其他的Interpreter对象,而不是直接操作数字。* left和right即可能是数字,也可能是其他的操作。*/
public class Multiply implements Interpreter {private Interpreter left;private Interpreter right;public Multiply(Interpreter left, Interpreter right) {this.left = left;this.right = right;}public double calculate(String expression) {return left.calculate(expression)*right.calculate(expression);}}
package xx.study.design.interpreter;/*** 实现除法操作,注意这里组合了其他的Interpreter对象,而不是直接操作数字。* left和right即可能是数字,也可能是其他的操作。*/
public class Divide implements Interpreter {private Interpreter left;private Interpreter right;public Divide(Interpreter left, Interpreter right) {this.left = left;this.right = right;}public double calculate(String expression) {return left.calculate(expression)/right.calculate(expression);}}
设计模式之 Interpreter(解释器) 通俗理解相关推荐
- 设计模式之 Composite(组合)通俗理解
23种设计模式 1 Composite 模式定义 将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite ...
- 23种设计模式通俗理解
23种设计模式通俗理解 1.根据目的来分 2.根据作用范围来分 3.GoF的23种设计模式的功能 1.FACTORY 工厂方法 2.BUILDER建造者模式 3.FACTORY METHOD抽象工厂 ...
- 设计模式学习笔记——解释器(Interpreter)模式
设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...
- java设计模式适配器模式_Java解释器设计模式
java设计模式适配器模式 Interpreter design pattern is one of the behavioral design pattern. Interpreter patter ...
- 通俗理解条件熵-数学
就是决策树里面选划分属性用到的计算 条件熵越小表示划分之后各个集合越纯净 前面我们总结了信息熵的概念通俗理解信息熵 - 知乎专栏,这次我们来理解一下条件熵. 我们首先知道信息熵是考虑该随机变量的所有可 ...
- 通俗理解tf.nn.conv2d() tf.nn.conv3d( )参数的含义 pytorhc 卷积
20210609 例如(3,3,(3,7,7))表示的是输入图像的通道数是3,输出图像的通道数是3,(3,7,7)表示过滤器每次处理3帧图像,卷积核的大小是3 x 7 x 7. https://blo ...
- 通俗理解tf.name_scope()、tf.variable_scope()
前言:最近做一个实验,遇到TensorFlow变量作用域问题,对tf.name_scope().tf.variable_scope()等进行了较为深刻的比较,记录相关笔记: tf.name_scope ...
- dft变换的两幅图_离散傅立叶变换DTFT、DFT和FFT在工程与数学结合的通俗理解
1.离散时间傅里叶变换DTFT 何为DTFT?就是对连续时间非周期信号进行抽样(乘积),得到的离散时间非周期信号再求傅里叶变换的过程就是DTFT.其实等同于信号频谱与脉冲信号频谱的卷积,这样得到的就是 ...
- 通俗理解kaggle比赛大杀器xgboost + XGBOOST手算内容 转
通俗理解kaggle比赛大杀器xgboost 转 https://blog.csdn.net/v_JULY_v/article/details/81410574 XGBOOST有手算内容 htt ...
最新文章
- 分支1-CentOS6.5下 正/反向域名解析之yum安装/编译安装 的教程
- 全球与中国人脸语音生物识别市场”十四“五规模状况与前景趋势分析报告2021-2027年版
- ma5626如何进入web配置_如何给Dnsmasq提供一个Web配置界面?
- oracle 每日归档量,小知识:统计Oracle的日归档量
- PHP socket初探 --- 一些零碎细节的拾漏补缺
- python解析properties文件
- 使用换IP软件的代理IP速度缓慢的原因是什么?详解!
- 探秘Google新搜索引擎算法
- 王佩丰excel教程笔记(认识excel)
- 百度富文本编辑器上传图片到oss的步骤
- 小韦系统装工行网银U盾驱动的方法
- React 多页签方案
- 克服焦虑最好的办法就是让一切变得有序
- python format函数 日期_Python-日期格式化
- 设计模式:策略模式+观察者模式
- 微服务的架构模式:一个服务一个数据库模式
- 网络爬虫学习第一弹:urllib库使用
- 如何用友远程到服务器,用友远程通安装常用的管理配置
- 免费无限次的API 接口
- 中国旅游研究院携程:2018中国在线旅游发展大数据指数报告(附下载)
热门文章
- 数据结构--------课后题
- python定义一个空列表lt_11个python列表方法全面解析!
- Android 10.0 Launcher3 单层app列表页排序功能实现
- 在手机开发中常用的数据库是什么?
- js移动端rem.js自适应布局代码
- 【AtCoder】AtCoder Grand Contest 041
- windows下载Android系统源码
- 软件运行的好好的,突然黑屏啥也进不去了
- Ipad软件paper破解方法
- HTML如何设置幻灯片大小和位置,PPT教程:教你如何在PPT母版中统一标题的位置、大小、样式 | 演示说...