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

行为模式7.解释器模式------DSL语言

 行为型模式

  1. 模板方法模式(Template Method Pattern)
  2. 命令模式(Command Pattern)
  3. 迭代器模式(Iterator Pattern)
  4. 观察者模式(Observer Pattern)
  5. 中介者模式(Mediator Pattern)
  6. 备忘录模式(Memento Pattern)
  7. 解释器模式(Interpreter Pattern)
  8. 状态模式(State Pattern)
  9. 策略模式(Strategy Pattern)
  10. 职责链模式(Chain of Responsibility Pattern)
  11. 访问者模式(Visitor Pattern)

解释器模式

解释器模式是一种行为设计模式,它定义了一个语言的文法,并且建立一个解释器来解释该语言中的句子。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。

以下是状态模式的基本结构和示例:

结构

这些组件共同工作,使得解释器模式能够解释特定语言的表达式,从而实现对该语言的解释和执行。

  1. 解释器模式的结构包括以下几个关键组件:

  2. 抽象表达式(Abstract Expression):定义了解释操作的抽象接口,为文法中的每个符号(终结符或非终结符)都声明了一个解释操作。这个接口为抽象语法树中所有的节点所共享。

  3. 终结符表达式(Terminal Expression):实现了与文法中的终结符相关联的解释操作。对于语言中的每个终结符,都有一个终结符表达式与之对应。

  4. 非终结符表达式(Nonterminal Expression):为文法中的非终结符实现解释操作。非终结符表达式根据文法规则递归调用自身或其他表达式,以实现对语言句子的解释。

  5. 上下文(Context):包含解释器之外的一些全局信息,这些信息对解释器的解释操作可能有用。

  6. 客户端(Client):构建抽象语法树,并调用解释操作来解释表达式。客户端通常负责创建抽象语法树,提供上下文信息,并调用解释操作来解释表达式。

示例

让我们以一个简单的灯光控制器为例来说明状态模式。

import java.util.HashMap;  // 抽象表达式  
interface Expression {  int interpret(HashMap<String, Integer> context);  
}  // 终结符表达式 - 变量  
class Variable implements Expression {  private String name;  public Variable(String name) {  this.name = name;  }  public int interpret(HashMap<String, Integer> context) {  if (context.containsKey(name)) {  return context.get(name);  }  return 0; // 默认返回0  }  
}  // 非终结符表达式 - 加法  
class Add implements Expression {  private Expression left;  private Expression right;  public Add(Expression left, Expression right) {  this.left = left;  this.right = right;  }  public int interpret(HashMap<String, Integer> context) {  return left.interpret(context) + right.interpret(context);  }  
}  // 客户端  
public class InterpreterExample {  public static void main(String[] args) {  // 构建抽象语法树  Expression expression = new Add(new Variable("x"), new Variable("y"));  // 设置上下文  HashMap<String, Integer> context = new HashMap<>();  context.put("x", 10);  context.put("y", 5);  // 解释和执行表达式  int result = expression.interpret(context);  System.out.println(result);  // Output: 15  }  
}  

这段代码演示了如何使用解释器模式来实现一个简单的自定义脚本语言的解释器。让我们一步步来解释这段代码。

首先,我们定义了接口 `Expression`,它包含了一个 `interpret` 方法,用于解释表达式。这是解释器模式中的抽象表达式。

然后,我们定义了两个具体的表达式类:

  1. `Variable` 类表示变量,它实现了 `Expression` 接口中的 `interpret` 方法,用于从上下文中获取变量的值。
  2. `Add` 类表示加法操作,它也实现了 `Expression` 接口中的 `interpret` 方法,用于对左右两个表达式进行加法操作。

在客户端代码中,我们首先构建了一个抽象语法树,这里是一个加法表达式,其中包括了两个变量相加的操作。然后,我们设置了上下文信息,即变量 `x` 和 `y` 的值。接下来,我们调用表达式的 `interpret` 方法,并传入上下文信息,以获取并输出表达式的结果。

这样,我们通过解释器模式成功地实现了一个简单的自定义脚本语言的解释器。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 软件设计原则之接口隔离原则
  • 10、ollama启动LLama_Factory微调大模型(llama.cpp)
  • 网闸与防火墙的区别
  • Python中排序算法之冒泡排序
  • k8s单master多node环境搭建-k8s版本低于1.24,容器运行时为docker
  • deque容器---C++
  • 第4章-06-让无头浏览器加载扩展插件
  • 小程序中使用page-container来做弹窗
  • C++ 洛谷 哈希表(对应题库:哈希,hash)习题集及代码
  • 【FPGA】入门学习路线
  • 【Python系列】SQLAlchemy 基本介绍
  • 等保2.0--安全计算环境--TiDB数据库
  • ThinkPHP A表和B表一对多关联,根据B表中符合条件记录的某个字段的值对A表数据进行排序。
  • 更改网络ip地址时出现错误怎么办
  • 深度学习项目实践——qq聊天机器人(transformer)(二)配置环境与部署
  • [笔记] php常见简单功能及函数
  • css属性的继承、初识值、计算值、当前值、应用值
  • Effective Java 笔记(一)
  • iOS 颜色设置看我就够了
  • Lsb图片隐写
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • python大佬养成计划----difflib模块
  • select2 取值 遍历 设置默认值
  • Spring Cloud中负载均衡器概览
  • STAR法则
  • storm drpc实例
  • 闭包--闭包作用之保存(一)
  • 从零开始的无人驾驶 1
  • 第2章 网络文档
  • 分布式任务队列Celery
  • 浮现式设计
  • 关于 Cirru Editor 存储格式
  • 基于axios的vue插件,让http请求更简单
  • 排序(1):冒泡排序
  • 前端js -- this指向总结。
  • 前端技术周刊 2019-01-14:客户端存储
  • 2017年360最后一道编程题
  • C# - 为值类型重定义相等性
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C语言)共用体union的用法举例
  • (pojstep1.1.2)2654(直叙式模拟)
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (排序详解之 堆排序)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (原創) 未来三学期想要修的课 (日記)
  • (转) Face-Resources
  • (转)视频码率,帧率和分辨率的联系与区别
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换