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

设计模式笔记_行为型_解释器模式

1.解释器模式介绍

解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义语言的语法表示,并且通过实现一个解释器来解析该语言的句子。它通常用于设计一个简单的语言解释器,或者在语法分析和编译器设计中使用。

类比场景:可以将解释器模式类比为一个简单的计算器,它能够解释和计算基本的数学表达式,比如“3 + 5”。在这个例子中,每一个数字和运算符都是语言的基本元素,解释器能够识别这些元素并执行相应的计算。

结构组成:解释器模式通常包括以下几个组件:

  1. 抽象表达式(AbstractExpression):定义解释操作的接口。
  2. 终结符表达式(TerminalExpression):实现与语法中的终结符相关的解释操作。
  3. 非终结符表达式(NonTerminalExpression):实现与语法中的非终结符相关的解释操作。
  4. 上下文(Context):包含解释器之外的全局信息。

优点和局限性:

  • 优点
    • 易于实现简单的语言和语法。
    • 可以通过组合表达式轻松扩展语言的功能。
  • 局限性
    • 不适合复杂的语法结构,因为会导致类爆炸,难以维护。
    • 性能可能较低,因为每个语法解析都需要创建新的表达式对象。

适用场景

  • 适用于简单的解析任务,如自定义脚本语言、简单数学表达式计算等。
  • 不适合复杂语言解析器。

2.代码演示

演示场景: 模拟计算器,计算 x+(x-y) 的值。

抽象表达式(AbstractExpression):定义解释操作的接口

// 抽象表达式
public interface Expression {// context 为上下文信息int interpret(Map<String, Integer> context);
}

终结符表达式(TerminalExpression):实现与语法中的终结符相关的解释操作

// 终结符表达式
public class NumberExpression implements Expression {private String variable;public NumberExpression(String variable) {this.variable = variable;}@Overridepublic int interpret(Map<String, Integer> context) {return context.get(variable);}
}

非终结符表达式(NonTerminalExpression):实现与语法中的非终结符相关的解释操作

// 非终结符表达式
public class AddExpression implements Expression {private final Expression left;private final Expression right;public AddExpression(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic int interpret(Map<String, Integer> context) {return left.interpret(context) + right.interpret(context);}
}public class SubtractExpression implements Expression {private final Expression left;private final Expression right;public SubtractExpression(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic int interpret(Map<String, Integer> context) {return left.interpret(context) - right.interpret(context);}
}

客户端代码:

public class InterpreterClientDemo {public static void main(String[] args) {// 定义上下文Map<String, Integer> context = Map.of("x", 5, "y", 3);// 创建表达式Expression expression = new AddExpression(new NumberExpression("x"),new SubtractExpression(new NumberExpression("x"), new NumberExpression("y")));// 解释表达式int result = expression.interpret(context);System.out.println("Result: " + result);  // 输出结果:Result: 7}
}

对应的类图:

http://www.dtcms.com/a/339941.html

相关文章:

  • 集成电路学习:什么是Thresholding阈值处理
  • PowerBI VS FineBI VS QuickBI实现帕累托分析
  • Go 并发入门:从 goroutine 到 worker pool
  • 用 C++ 构建高性能测试框架:从原型到生产实战指南
  • Python 项目里的数据预处理工作(数据清洗步骤与实战案例详解)
  • 在线客服系统访客表的设计与实现-增加最新消息字段
  • Task01: CAMEL环境配置及第一个Agent
  • Kubernetes Ingress实战:从环境搭建到应用案例
  • C语言基础:(十九)数据在内存中的存储
  • Java线程池参数配置的坑:`corePoolSize=0` + `LinkedBlockingQueue`直接变成串行执行
  • Python爬虫第二课:爬取HTML静态网页之《某某小说》 小说章节和内容完整版
  • 智驾-AEB
  • 羟氯喹通过抑制抗磷脂综合征诱导的绒毛外滋养细胞过度自噬
  • 【模版匹配】基于深度学习
  • 洛谷 P2834 纸币问题 3-普及-
  • 《当 AI 学会 “思考”:大语言模型的逻辑能力进化与隐忧》
  • centos 总有new mail出现原因
  • [论文阅读] 软件工程 - 用户体验 | VR应用的无障碍性困局:基于Meta和Steam商店评论的深度剖析
  • 多幅图片拼接算法系统
  • FIFO通讯速率> 30MB/s,CH346保障FPGA与PC的高速通道稳定高效
  • 当GitHub宕机时,我们如何协作
  • 工业4.0时代,耐达讯自动化Profibus转光纤如何重构HMI通信新标准?“
  • HTML应用指南:利用GET请求获取全国新荣记门店位置信息
  • 【DAB收音机】DAB服务跟随Service Follow功能(三)【FIG 0/24:OE Services】
  • Browser Use + Playwright到AI Agent:Web自动化如何实现质变?
  • C++装饰器模式:从“勇勇”例子到实际应用
  • Day09 Go语言深入学习(1)
  • 单片机编程架构
  • AttributeError: module ‘ffmpeg‘ has no attribute ‘probe‘
  • 【光学神经网络与人工智能应用专题】