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(解释器) 通俗理解相关推荐

  1. 设计模式之 Composite(组合)通俗理解

    23种设计模式 1 Composite 模式定义 将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite ...

  2. 23种设计模式通俗理解

    23种设计模式通俗理解 1.根据目的来分 2.根据作用范围来分 3.GoF的23种设计模式的功能 1.FACTORY 工厂方法 2.BUILDER建造者模式 3.FACTORY METHOD抽象工厂 ...

  3. 设计模式学习笔记——解释器(Interpreter)模式

    设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...

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

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

  5. 通俗理解条件熵-数学

    就是决策树里面选划分属性用到的计算 条件熵越小表示划分之后各个集合越纯净 前面我们总结了信息熵的概念通俗理解信息熵 - 知乎专栏,这次我们来理解一下条件熵. 我们首先知道信息熵是考虑该随机变量的所有可 ...

  6. 通俗理解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 ...

  7. 通俗理解tf.name_scope()、tf.variable_scope()

    前言:最近做一个实验,遇到TensorFlow变量作用域问题,对tf.name_scope().tf.variable_scope()等进行了较为深刻的比较,记录相关笔记: tf.name_scope ...

  8. dft变换的两幅图_离散傅立叶变换DTFT、DFT和FFT在工程与数学结合的通俗理解

    1.离散时间傅里叶变换DTFT 何为DTFT?就是对连续时间非周期信号进行抽样(乘积),得到的离散时间非周期信号再求傅里叶变换的过程就是DTFT.其实等同于信号频谱与脉冲信号频谱的卷积,这样得到的就是 ...

  9. 通俗理解kaggle比赛大杀器xgboost + XGBOOST手算内容 转

    通俗理解kaggle比赛大杀器xgboost    转 https://blog.csdn.net/v_JULY_v/article/details/81410574 XGBOOST有手算内容 htt ...

最新文章

  1. 分支1-CentOS6.5下 正/反向域名解析之yum安装/编译安装 的教程
  2. 全球与中国人脸语音生物识别市场”十四“五规模状况与前景趋势分析报告2021-2027年版
  3. ma5626如何进入web配置_如何给Dnsmasq提供一个Web配置界面?
  4. oracle 每日归档量,小知识:统计Oracle的日归档量
  5. PHP socket初探 --- 一些零碎细节的拾漏补缺
  6. python解析properties文件
  7. 使用换IP软件的代理IP速度缓慢的原因是什么?详解!
  8. 探秘Google新搜索引擎算法
  9. 王佩丰excel教程笔记(认识excel)
  10. 百度富文本编辑器上传图片到oss的步骤
  11. 小韦系统装工行网银U盾驱动的方法
  12. React 多页签方案
  13. 克服焦虑最好的办法就是让一切变得有序
  14. python format函数 日期_Python-日期格式化
  15. 设计模式:策略模式+观察者模式
  16. 微服务的架构模式:一个服务一个数据库模式
  17. 网络爬虫学习第一弹:urllib库使用
  18. 如何用友远程到服务器,用友远程通安装常用的管理配置
  19. 免费无限次的API 接口
  20. 中国旅游研究院携程:2018中国在线旅游发展大数据指数报告(附下载)

热门文章

  1. 数据结构--------课后题
  2. python定义一个空列表lt_11个python列表方法全面解析!
  3. Android 10.0 Launcher3 单层app列表页排序功能实现
  4. 在手机开发中常用的数据库是什么?
  5. js移动端rem.js自适应布局代码
  6. 【AtCoder】AtCoder Grand Contest 041
  7. windows下载Android系统源码
  8. 软件运行的好好的,突然黑屏啥也进不去了
  9. Ipad软件paper破解方法
  10. HTML如何设置幻灯片大小和位置,PPT教程:教你如何在PPT母版中统一标题的位置、大小、样式 | 演示说...