当前位置: 首页 > web >正文

java 设计模式_行为型_18解释器模式

18.解释器模式
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。

解释器模式在我们开发过程中并不常用,是个比较小众的设计模式。这种模式通常被用在 SQL 解析、符号处理引擎等。

什么是符号处理引擎呢?举几个例子,

强大而又令人望而却步的正则表达式,相信大多数程序猿都接触过吧,[0-9a-zA-Z]+这样一串符号就能够匹配一个由数字和大小写字母组成的字符串。类似的还有XML文件的解析、SQL语句的解析等等。
假设你做了一个机器人,可以通过指令告诉它如何执行动作,比如向前走10个单位是forward 10,向左转是turn left,当你输入begin forward 10 turn left forward 5 end 组成的命令给它的终端,它就能明白命令的意思(向前走10个单位然后左转走5个单位)并执行。
在举个简单点的例子,正则表达式,我们通常用的计算器是一步一步来的,比如2+3-4/2=当输入+、-``/和=的时候都会立即响应。但是还有种计算器,可以在输入整个公式后,一并进行计算,这种计算器可以直接输入2+3-4/2然后回车后直接给出整个式子的结果,这种计算器就是“解释型”计算器。

UML用例图:
在这里插入图片描述

一、先声明一个解释型接口

public interface Expression {double interpret();
}

二、终结符表达式

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Num implements Expression {private double number;@Overridepublic double interpret() {return number;}
}

三、非终结符表达式(分别对应加减乘除)

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Add implements Expression {private Expression left,right;@Overridepublic double interpret() {return left.interpret()+right.interpret();}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Sub implements Expression {private Expression left,right;@Overridepublic double interpret() {return left.interpret()-right.interpret();}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Mul implements Expression {private Expression left,right;@Overridepublic double interpret() {return left.interpret()*right.interpret();}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Div implements Expression {private Expression left,right;@Overridepublic double interpret() {return left.interpret()/right.interpret();}
}

四、测试类

public class InterpretTest {public static void main(String[] args) {Expression a = new Num(2),b=new Num(3),c=new Num(4),d=new Num(2);Expression result = new Sub(new Add(a,b),new Div(c,d));System.out.println(result.interpret());}
}
http://www.xdnf.cn/news/14399.html

相关文章:

  • 【MySQL】TencentOS 安装登录MySQL
  • 【Flutter】解决小米澎湃系统迷你窗口、缩小窗口后界面空白问题
  • 电阻篇---常见作用
  • Rviz2中,在rviz和launch文件中都需要配置urdf文件,二者作用上的区别?
  • hot100 -- 13.堆系列
  • MongoDB使用安全的sha256认证
  • 【Elasticsearch】文档(二):更新
  • FPGA中的DMA技术
  • 制作微PE U盘后电脑多出300M盘符(EFI分区)无法隐藏的解决过程
  • Vue3 Pinia Store 生命周期管理
  • 前端开发面试题总结-vue2框架篇(二)
  • 国产替代新标杆|盟接之桥EDI软件让中国制造连接世界更安全、更简单、更有底气
  • AI for Science:智能科技如何重塑科学研究
  • 机器能做科学家吗?一场关于开放式科研的 AI 革命
  • 人工智能嵌入公共服务治理的风险挑战(三)
  • day31 文件的规范拆分和写法
  • 多线程与多进程技术全景对比
  • 平均数与倍数
  • 地理空间视角下的 SIR 传染病模型模拟与可视化
  • ObservedV2装饰器和Trace装饰器
  • 浏览器拨打电话 nginx代理wss (mod_cti基于FreeSWITCH)
  • 山东大学软件学院创新项目实训开发日志——第十六周
  • 【Python打卡Day40】训练与测试的规范写法 @浙大疏锦行
  • LeCun破局:大模型与人类思考的本质分野
  • 快速学习GO语言总结
  • JNDI注入入门
  • jetson nano 无法启动排查实录:使用i2c误写 EEPROM (地址 0x50)引发的修复经历
  • RT1176 QDEC引脚全解析:精准定位编码器接口资源
  • 内容风控概念基础
  • 前端基础知识CSS系列 - 03(em/px/rem/vh/vw)