文章目录

  • 一、解释器模式简介
  • 二、解释器模式适用场景
  • 三、解释器模式优缺点
  • 四、解释器模式与适配器模式
  • 五、解释器模式代码示例
    • 1、解释器接口
    • 2、加法解释器
    • 3、乘法解释器
    • 4、整型解释器
    • 5、语法解析类
    • 6、工具类
    • 7、测试类

一、解释器模式简介


解释器模式 : 给定一个 语言 , 定义它的 文法 的一种表示 , 并定义一个 解释器 , 这个 解释器 使用该表示来 解释 语言中的 句子 ;

文法 可以理解成一种 语法 ;

为了解释一种语言 , 而为语言创建的 解释器 ;

如 : Java 代码 , 需要编译器进行编译之后才能运行 , 这个编译器就相当于解释器 ;

解释器模式类型 : 行为型 ;

二、解释器模式适用场景


解释器模式适用场景 : 某个 特定类型问题 发生频率 足够高 ;

日志处理 : 使用 脚本语言 或 编程语言 处理日志时 , 有很多服务 会产生 大量的日志 , 需要 对日志进行解析 , 生成报表 ;

各个服务的日志格式不同 , 数据中的要素相同 , 这种情况下 , 通过程序解决上述问题 , 主要的解决方案就是使用解释器模式 ;

日常项目中 , 解释器模式使用情况很少 ;

解释器一般是 开源包 , 如 Express4J , JEP ;

三、解释器模式优缺点


解释器模式优点 : 语法 由 很多类 表示 , 容易 改变 及 扩展 " 语言 " ;

" 语言 " 用引号标注 , 这些语言不足以称为一门 编程语言 ;

解释器模式缺点 : 如果 语法规则 数目太多 , 会增加 系统 复杂度 ;

每个规则 都要与之对应 一个类 , 如果规则太多 , 则需要创建很多类 ;

解释器模式在实际业务中 , 是使用频率很低的设计模式 ;

四、解释器模式与适配器模式


解释器模式与适配器模式 : 这两个模式类似 , 但是略有不同 ;

  • 适配器模式 : 不需要 预先知道 适配器的 规则 ;

  • 解释器模式 : 需要 预先将规则写好 , 根据规则执行解释 ;

五、解释器模式代码示例


业务场景 :

输入字符串

10 2 3 + *

将字符串使用空格切割成数组
遇到数字直接入栈
遇到运算符 , 从栈中取出两个数据 , 进行计算 , 将计算结果再放入栈中
遍历完毕后 , 最终的栈内数据就是最终结果

1、解释器接口

package interpreter;/*** 解释器接口*/
public interface Interpreter {/*** 解释方法* @return*/int interpret();
}

2、加法解释器

package interpreter;/*** 加法解释器*      实现 Interpreter 解释器 接口* 用于实现加法计算*      加法有加数 和 被加数 , 两个加数分别也都是一个解释器*/
public class AddInterpreter implements Interpreter {/*** 第一个表达式*/private Interpreter firstInterpreter;/*** 第二个表达式*/private Interpreter secondInterpreter;public AddInterpreter(Interpreter firstInterpreter,Interpreter secondInterpreter) {this.firstInterpreter = firstInterpreter;this.secondInterpreter = secondInterpreter;}@Overridepublic int interpret() {return this.firstInterpreter.interpret() +this.secondInterpreter.interpret();}@Overridepublic String toString() {return "+";}
}

3、乘法解释器

package interpreter;/*** 乘法解释器*      实现 Interpreter 解释器 接口* 用于实现乘法计算*      两个乘数分别也都是一个解释器*/
public class MultiInterpreter implements Interpreter {/*** 第一个表达式*/private Interpreter firstInterpreter;/*** 第二个表达式*/private Interpreter secondInterpreter;public MultiInterpreter(Interpreter firstInterpreter,Interpreter secondInterpreter) {this.firstInterpreter = firstInterpreter;this.secondInterpreter = secondInterpreter;}@Overridepublic int interpret() {return this.firstInterpreter.interpret() *this.secondInterpreter.interpret();}@Overridepublic String toString() {return "*";}
}

4、整型解释器

package interpreter;/*** 数字解释器*      实现 Interpreter 解释器 接口*/
public class NumberInterpreter implements Interpreter {/*** 核心数字*      需要将传入的数据转为数字*/private int number;/*** 直接设置数字类型* @param number*/public NumberInterpreter(int number) {this.number = number;}/*** 将字符串转为数字类型* @param number*/public NumberInterpreter(String number) {this.number = Integer.parseInt(number);}@Overridepublic int interpret() {return this.number;}@Overridepublic String toString() {return "" + this.number;}
}

5、语法解析类

package interpreter;import java.util.Stack;/*** 语法解析*/
public class ExpressionParser {/*** 存放解释器的栈*      栈的特点是先进后出*/private Stack<Interpreter> stack = new Stack<>();/*** 解析字符串语法* @param str*/public void parse(String str) {// 通过空格分割字符串String[] strArray = str.split(" ");// 遍历栈中的字符串for (String symbol : strArray) {if (!OperatorUtils.isOperator(symbol)) {// 如果不是操作符 , 说明是数字 , 则直接入栈Interpreter interpreter = new NumberInterpreter(symbol);stack.push(interpreter);System.out.println(symbol + " 入栈");} else {// 如果是操作符 , 则数据出栈 , 处理是操作符运算的情况// 取出两个需要计算的元素Interpreter firstInterpreter = stack.pop();System.out.println(firstInterpreter + " 出栈");Interpreter secondInterpreter = stack.pop();System.out.println(secondInterpreter + " 出栈");// 获取 运算符号 对应的解释器Interpreter operator = OperatorUtils.getExpressionInterpretor(symbol,firstInterpreter,secondInterpreter);System.out.println("运算符 " + operator + " 出栈");// 计算 运算符 运算结果int result = operator.interpret();// 将计算结果你年入栈NumberInterpreter numberInterpreter = new NumberInterpreter(result);stack.push(numberInterpreter);System.out.println("计算结果 " + result + " 入栈");}}// 取出最终计算结果 , 计算完毕后 , 整个栈必然只剩下一个元素int result = stack.pop().interpret();System.out.println("最终计算结果 : " + result);}
}

6、工具类

package interpreter;public class OperatorUtils {/*** 判断传入的符号字符串是否是操作符* @param symbol* @return*/public static boolean isOperator(String symbol) {return symbol.equals("+") || symbol.equals("*");}public static Interpreter getExpressionInterpretor(String symbol,Interpreter firstInterpreter,Interpreter secondInterpreter) {Interpreter interpreter = null;if (symbol.equals("+")) {interpreter = new AddInterpreter(firstInterpreter, secondInterpreter);} else if (symbol.equals("*")) {interpreter = new MultiInterpreter(firstInterpreter, secondInterpreter);}return interpreter;}
}

7、测试类

package interpreter;public class Main {public static void main(String[] args) {// 将字符串使用空格切割成数组// 遇到数字直接入栈// 遇到运算符 , 从栈中取出两个数据 , 进行计算 , 将计算结果再放入栈中// 遍历完毕后 , 最终的栈内数据就是最终结果String text = "10 2 3 + *";ExpressionParser parser = new ExpressionParser();parser.parse(text);}
}

执行结果 :

10 入栈
2 入栈
3 入栈
3 出栈
2 出栈
运算符 + 出栈
计算结果 5 入栈
5 出栈
10 出栈
运算符 * 出栈
计算结果 50 入栈
最终计算结果 : 50

【设计模式】解释器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )相关推荐

  1. 【设计模式】模板方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.模板方法模式简介 二.模板方法模式适用场景 三.模板方法模式优缺点 四.模板方法扩展 五.模板方法模式相关设计模式 六.模板方法模式代码示例 1.模板方法抽象类 2.模板方法实现类 1 ...

  2. 【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.策略模式简介 二.策略模式适用场景 三.策略模式优缺点 四.策略模式与其它设计模式 五.策略模式代码示例 1.促销策略接口 2.满减促销策略 3.返现促销策略 4.空促销策略 5.促销策 ...

  3. 【设计模式】中介者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.中介者模式简介 二.中介者模式适用场景 三.中介者模式优缺点 四.中介者模式 与 观察者模式 五.中介者模式 代码示例 1.聊天室 2.用户 3.运行实例 一.中介者模式简介 中介者模式 ...

  4. 【设计模式】状态模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.状态模式简介 二.状态模式适用场景 三.状态模式优缺点 四.状态模式相关设计模式 五.状态模式代码示例 1.状态类父类 2.播放状态类 3.暂停状态类 4.快进状态类 5.停止状态类 6 ...

  5. 【设计模式】访问者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.访问者模式简介 二.访问者模式 适用场景 三.访问者模式 优缺点 四.访问者模式 与 迭代器模式 五.代码示例 1.Game 父类 ( 被访问者 ) 2.VipGame 收费游戏 ( 被 ...

  6. 【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.桥接模式简介 二.桥接模式适用场景 三.桥接模式优缺点 四.桥接模式相关设计模式 五.桥接模式代码示例 1.视频格式抽象 2.FLV 视频格式实现 3.MP4 视频格式实现 4.系统平台 ...

  7. 【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.工厂方法模式简介 二.工厂方法模式适用场景 三.工厂方法模式优缺点 四.工厂方法模式代码示例 1.产品抽象类 2.产品实现类 1 3.产品实现类 2 4.抽象工厂类 5.实现工厂类 1 ...

  8. 【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.建造者模式简介 二.建造者模式适用场景 三.建造者模式优缺点 四.建造者模式与工厂模式 五.建造者模式代码示例 1.学生类 2.建造者抽象类 3.建造者实现类 4.教师类 ( 非必须 ) ...

  9. 【设计模式】组合模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.组合模式简介 二.组合模式适用场景 三.组合模式优缺点 四.组合模式和访问者模式 五.组合模式代码示例 1.书籍和目录的抽象父类 2.书籍类 3.目录类 4.测试类 一.组合模式简介 组 ...

最新文章

  1. combobox 取消记忆功能_南京长江大桥桥头堡空间改造设计,记忆与纪念的共鸣
  2. Wpf 数据绑定简介、实例1
  3. 1473. A + B 格式
  4. 小型超市管理系统(JAVA,JSP,SSH,MYSQL)
  5. H265分辨率解码概述
  6. CRM系统提高企业核心竞争力
  7. PLC通过PIO模式控制绝对位置型IAI电缸
  8. 【26天高效学习Java编程】Day26(完结篇):Java中的单例、多例、枚举以及工厂模式详解
  9. win10删除文件夹提示需要管理员权限的解决办法
  10. 代做assignment分享高分Essay写作攻略
  11. 阿里云后台部署全过程-2-Linux环境配置
  12. 解决Chrome插件安装时报错:“Manifest file is missing or unreadable“
  13. C++ 20 std::chrono 库使用 | std::chrono::year_month_day |std::chrono::hh_mm_ss 使用
  14. 微信点餐小程序(外卖配送)解决方案
  15. 20189200余超 2018-2019-2 移动平台应用开发实践第二周作业
  16. system verilog断言学习笔记
  17. 手机屏幕xy坐标软件_软件工程中的xy问题
  18. 基于stm32和ESP8266实现wifi模块smartlink功能以及TCP连接
  19. 《div图层被鼠标划过时其背景色变色的五种方式》
  20. ESTIMATE包计算肿瘤纯度

热门文章

  1. java写输出春夏秋冬_Java案例:三个和尚,考试奖励,春夏秋冬,输出测试
  2. 计算机专业 英语六级作文,英语六级作文范文 计算机和人 Computer and Man
  3. 为什么说“好用”的飞书是中国办公软件的新变量?
  4. 德阳事业单位考计算机知识,2013德阳事业单位计算机考试常考知识点.doc
  5. 【Vue简易入门】什么是Vue?
  6. 注塑行业实现智能化工厂,从导入APS系统开始
  7. 项目经理眼中优秀开发人员的标准
  8. 面试常问!!TCP的三次握手与四次挥手理解
  9. 日常问题解决:英频杰读卡器(门禁)安装部署
  10. AI让城市交通管理更“智慧”