当前位置: 首页 > 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.lryc.cn/news/626092.html

相关文章:

  • 【Spring Boot把日志记录到文件里面】
  • 疯狂星期四文案网第44天运营日记
  • GPT-5论文写作全流程提示词库
  • MAC 设置输入法
  • 为 Time 类实现构造函数,默认初始化成 23:59:55,也可以指定时间,要求使用初始化参数列表:C++代码解释
  • linux服务器rsyslog进程启动失败分析
  • Python 项目里的数据预处理工作(数据清洗步骤应用)续篇
  • 3D检测笔记:MMDetection3d环境配置
  • Kubernetes Pod 控制器
  • 基于uni-app的成人继续教育教务管理系统设计与实现
  • PyTorch自动求导
  • 开源 C++ QT Widget 开发(一)工程文件结构
  • vfs_statfs使用 查看当前文件系统一些信息情况
  • RocketMq消费者动态订阅topic
  • 聚合链路与软件网桥的原理及配置方法
  • 【LeetCode 热题 100】279. 完全平方数——(解法一)记忆化搜索
  • JVM原生的assert关键字
  • 手写C++ string类实现详解
  • 使用redis读写锁实现抢券功能
  • 怎样平衡NLP技术发展中数据质量和隐私保护的关系?
  • JVM 面试精选 20 题(续)
  • JVM对象创建和内存分配
  • SpringAI接入openAI配置出现的问题全解析
  • 今日行情明日机会——20250819
  • Java开发面试实战:Spring Boot微服务与数据库优化案例分析
  • 星图云开发者平台新功能速递 | 微服务管理器:无缝整合异构服务,释放云原生开发潜能
  • 微服务如何集成swagger3
  • 微服务-08.微服务拆分-拆分商品服务
  • UE5 使用RVT制作地形材质融合
  • idea如何设置tab为4个空格