《golang设计模式》第三部分·行为型模式-03-解释器模式(Interpreter)
文章目录
- 1. 概述
- 1.1 角色
- 1.2 类图
- 1.3 优缺点
- 2. 代码示例
- 2.1 设计
- 2.2 代码
- 2.3 类图
1. 概述
解释器模式(Interpreter)是用于表达语言语法树和封装语句解释(或运算)行为的对象。
1.1 角色
- AbstractExpression(抽象表达式):具体表达式的一个抽象接口,交由具体子类进行具体解释
- TerminalExpression(终结符表达式):实现文法中与终结符有关的解释操作
- NonTerminalExpression(非终结符表达式):实现文法中与非终结符有关的解释操作
- Context(上下文环境类):解释器上下文环境类
- Client :持有上下文和抽象表达式,
1.2 类图
1.3 优缺点
- 优点
- 可拓展性高,灵活
- 易于实现简单的文法
- 缺点
- 可使用场景少
- 对于复杂的文法较难维护
- 会引起类膨胀
2. 代码示例
2.1 设计
需求:COS的设计
- 定义一个上下文,用来对字串做表达前的处理。
- 本例中只需要将字串切割成字符列表备用。
- 定义一个抽象表达式
- 它由加、减两、数值三个具体表达式分别实现
- 只是一个表达式,被客户端组装之后才能显示它的实际作用。
- 它由加、减两、数值三个具体表达式分别实现
- 定义一个客户端
- 持有上下文,意味着他可以实例化一个上下文来对COS的字串做表达前的处理。
- 持有表达式,意味着它可以实例化并组装一个表达式
2.2 代码
- 代码
package mainimport ("fmt""strconv""strings"
)// 定义一个抽象表达式
type Node interface {Interpreter() int
}// 定义终结表达式
type ValNode struct {val int
}func (v *ValNode) Interpreter() int {return v.val
}// 定义非终结表达式——加法
type AddNode struct {left Noderight Node
}func (a *AddNode) Interpreter() int {return a.left.Interpreter() + a.right.Interpreter()
}// 定义非终结表达式——减法
type SubNode struct {left Noderight Node
}func (s *SubNode) Interpreter() int {return s.left.Interpreter() - s.right.Interpreter()
}// 定义上下文
type Context struct {exp []stringindex int
}// 它的方法负解释前的所有处理
func (c *Context) GetList(exp string) {c.exp = strings.Split(exp, " ")
}// 定义客户端,它持有上下文和解释器
type Client struct {context Contextprev Node
}// 构造表达式
func (p *Client) CreateNode(expString string) Node {p.context = Context{}p.context.GetList(expString)for {if p.context.index >= len(p.context.exp) {return p.prev}switch p.context.exp[p.context.index] {case "+":p.prev = p.CreateAddNode()case "-":p.prev = p.CreateSubNode()default:p.prev = p.CreateValNode()}}}// 三个方法用来创建node并参与表达式的拼装
func (p *Client) CreateAddNode() Node {p.context.index++return &AddNode{left: p.prev, right: p.CreateValNode()}
}func (p *Client) CreateSubNode() Node {p.context.index++return &SubNode{left: p.prev, right: p.CreateValNode()}
}func (p *Client) CreateValNode() Node {v, _ := strconv.Atoi(p.context.exp[p.context.index])p.context.index++return &ValNode{v}
}func main() {//实例化一个客户端p := &Client{}//拼装表达式node := p.CreateNode("1 + 5 - 3")//调用表达式得到结果result := node.Interpreter()//验证结果(实际应用中应该由客户端验证,我们这里打印出来口算验证一下好了。)fmt.Println(result)
}
- 输出
3
2.3 类图
相关文章:
《golang设计模式》第三部分·行为型模式-03-解释器模式(Interpreter)
文章目录 1. 概述1.1 角色1.2 类图1.3 优缺点 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 解释器模式(Interpreter)是用于表达语言语法树和封装语句解释(或运算)行为的对象。 1.1 角色 AbstractExpression(抽象表…...
Windows个性化颜色睡眠后经常改变
问题再现 我把系统颜色换成了一种红色,结果每次再打开电脑又变回去了(绿色); 原因是因为wallpaper engine在捣蛋 需要禁用修改windows配色这一块选项; 完事!原来是wallpaper engine的问题;...
calico ipam使用
calico ipam使用 前面的文章pod获取ip地址的过程中提到过calico使用的IP地址的管理模块是其自己开发的模块calico-ipam,本篇文章来讲述下其具体用法。 一、环境信息 版本信息 本环境使用版本是k8s 1.25.3 [rootnode1 ~]# kubectl get node NAME STATUS ROLES …...
Redis系统学习(高级篇)-Redis持久化-AOF方式
目录 一、是什么AOF? 二、AOF如何开启 以及触发策略有哪些 三、AOF文件重写 四、AOF与RDB对比 一、是什么AOF? 就是通过每次记录写操作,最终通过来依次这些命令来达到恢复数据的目的 二、AOF如何开启 以及触发策略有哪些 save "&q…...
云安全-云原生基于容器漏洞的逃逸自动化手法(CDK check)
0x00 docker逃逸的方法种类 1、不安全的配置: 容器危险挂载(挂载procfs,Scoket) 特权模式启动的提权(privileged) 2、docker容器自身的漏洞 3、linux系统内核漏洞 这里参考Twiki的云安全博客,下…...
精选10款Python可视化工具,请查收
今天我们会介绍一下10个适用于多个学科的Python数据可视化库,其中有名气很大的也有鲜为人知的。 1、matplotlib matplotlib 是Python可视化程序库的泰斗。经过十几年它仍然是Python使用者最常用的画图库。它的设计和在1980年代被设计的商业化程序语言MATLAB非常接近…...
大数据(21)-skew-GroupBy
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
window压缩包安装mongodb并注册系统服务
下载解压包 https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-5.0.22.zip启动mongod 解压压缩包 至 d:\mongodb目录中,创建目录data、logs。并创建配置文件mongod.conf输入以下配置 dbpath d:\mongodb\data logpath d:\mongodb\logs\mongo.log loga…...
【Java每日一题】——第四十五题:综合案例:模拟物流快递系统。(2023.11.1)
🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL:…...
二十二、Arcpy批量波段组合——结合Landat数据城市建成区提取
一、前言 其实波段组合和GIS中栅格计算有点类似,实质上就是对每个像素点对应的DN值进行数学计算,也就是可以进行运算表达式是三个或多个变量相加、相减……每一个变量对应于一个图像数据,对这三个或多个图像数据求值并输出结果图像。 二、具体操作 1、实验具体目标 将202…...
电脑上数据恢复的详细操作
在日常使用电脑过程中,我们可能会遇到数据丢失的情况。无论是因为误删除、格式化、病毒攻击还是硬件故障,数据恢复都是我们迫切需要解决的问题。本文将介绍电脑数据恢复的详细操作步骤,帮助读者在面临数据丢失时能够迅速地恢复重要文件。 一…...
3.1 linux控制内核打印printk demsg DEBUG
本文主要内容: 1 列出内核打印级别 2 修改内核打印级别 方法1 编译时 方法2 uboot时 方法3 启动后 3 DEBUG宏控制妙用 4 内存中各种打印函数封装 5 测试示例代码 1 打印级别 #define KERN_EMERG "<0>" /* system is unusable */ #define KERN_ALERT …...
关于爬虫API常见的技术问题和解答
随着互联网的快速发展,数据获取变得越来越重要。爬虫API作为一种高效的数据获取手段,被广泛应用于各种场景。然而,在实际使用过程中,我们经常会遇到一些技术问题。本文将详细介绍爬虫API的常见技术问题及相应的解决方案。 一、爬…...
在CentOS上用yum方式安装MySQL8过程记录
此文参考官方文档一步一步记录安装到正常运行全过程 安装环境:centos7 mysql版本:8.0.35 安装过程主要参考下面两边文章: 1.官方文档 https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html 2.linux yum安装mysql8 安…...
CEYEE希亦新品洗地机Pro系列发布, 领跑行业的「水汽混动」技术的旗舰新杰作
CEYEE希亦全新一代洗地机T800 PRO正式上市,采用双滚刷,双倍活水洗拖洗方式,达到拖一遍抵两遍,相对于10倍洁净效果! 这款希亦Pro系列产品不仅刷新了洗地机行业技术水准,满足了用户愈发极致的清洁效能追求&a…...
为什么要安装防静电门禁闸机
安装防静电门禁闸机可以带来以下几个方面的好处: 防止静电干扰:静电是一种非常危险的物理现象,它可以对电子元器件、电路板和其他敏感设备造成损害,甚至导致设备故障和生产中断。防静电门禁闸机可以有效地防止静电的产生和传导&am…...
[linux] shell中的()和{}
参考:https://www.cnblogs.com/cheer-lingmu/p/16467561.html 参考:shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)_linux shell_脚本之家 一、小括号() 1、命令替换:等同于cmd,shell扫描一遍命令行,发现了…...
jdk官网下载(详细步骤)
jdk全部版本下载网址 Java Archive | Oraclehttps://www.oracle.com/java/technologies/downloads/archive/ 下载之前先建立oracle账号(免费创建),不用特意去搜,你点击下载jdk的时候会自动弹出来,自己建立一个账号就能下载了 找到自己要下载…...
10.24 校招 实习 内推 面经
绿*泡*泡: neituijunsir 交流裙 ,内推/实习/校招汇总表格 1、校招 | 吉利控股集团2024届全球校园招聘路特斯科技专场(内推) 校招 | 吉利控股集团2024届全球校园招聘路特斯科技专场(内推) 2、数字IC验证…...
Pico Neo4、Neo3开发手柄的使用交互监听
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR;public class InputEvent : MonoSingleton<InputEvent> {//*************输入设别**************************InputDevice leftHandController;Inp…...
教培人必看!那些好用到哭的网课平台大盘点
一、引言:网课平台,教培行业的新战场 在互联网浪潮的席卷下,教培行业正经历着前所未有的变革。曾经,学生们只能在固定的时间和地点,坐在教室里听老师授课。而如今,随着网课平台的兴起,学习的时…...
从语义到轨迹:VLM/VLA如何重塑端到端自动驾驶的推理与执行
1. 视觉语言大模型如何打通自动驾驶的任督二脉 想象一下你坐在副驾驶教新手开车:"前面路口左转,注意右侧电动车,减速让行"——人类教练用语言就能传递复杂驾驶策略。但传统自动驾驶系统像两个语言不通的部门:感知模块输…...
ESP32逆向复现Enjoy Motors遮阳帘433MHz滚动码协议
1. 项目概述EnjoyRemoteLib 是一个专为 ESP32 平台设计的 Arduino 库,核心目标是完整复现 Enjoy Motors 系列电动遮阳帘遥控器的无线通信协议,从而实现对 EMSTEEL4 及兼容型号遮阳帘设备的非侵入式远程控制。该库并非基于厂商公开 SDK,而是通…...
不止是编译:深入理解OpenHarmony XTS测试套件(acts/hats/dcts)与你的代码质量守护
不止是编译:深入理解OpenHarmony XTS测试套件与代码质量守护 在OpenHarmony生态系统中,代码质量保障从来不是简单的编译通过就能解决的问题。当我们谈论XTS测试套件时,很多开发者第一反应是"如何编译运行",却忽略了这套…...
从零到一:HNU计算机系统实验原型机vspm1.0实战与miniCC编译初探
1. 初识HNU计算机系统实验原型机vspm1.0 第一次接触vspm1.0原型机时,我完全被这个精巧的教学工具吸引了。作为一个计算机系统初学者,最让我惊喜的是它用不到200行汇编指令就完整模拟了冯诺伊曼体系结构的核心要素。这台原型机配备了6个通用寄存器&#x…...
MPC路径跟踪控制横纵垂向控制:状态空间方程推导之旅
MPC路径跟踪控制横纵垂向控制状态空间方程推导服务,线性化和离散化 采用线性模型预测控制理论,推导离散状态空间方程。在自动驾驶以及许多运动控制领域,MPC(模型预测控制)就像一位运筹帷幄的智者,精准地规划…...
滤波实战:从原理到代码的平滑之旅
1. 滤波技术的前世今生 第一次接触滤波概念是在研究生时期做无人机姿态解算项目时。当时从陀螺仪和加速度计采集的原始数据跳得跟心电图似的,导师只说了一句"加个滤波器",却让我在图书馆泡了整整两周。现在回想起来,滤波本质上就是…...
开源工具Rufus实现专业级启动盘制作的完整指南
开源工具Rufus实现专业级启动盘制作的完整指南 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 系统重装时遇到的启动失败、镜像损坏、硬件不兼容等问题是否让你束手无策?作为一款免费…...
解决时间序列稀疏性难题:Time-Series-Library数据增强技术的创新方案
解决时间序列稀疏性难题:Time-Series-Library数据增强技术的创新方案 【免费下载链接】Time-Series-Library A Library for Advanced Deep Time Series Models. 项目地址: https://gitcode.com/GitHub_Trending/ti/Time-Series-Library 在工业预测系统的开发…...
Comsol中双BIC复现的电磁感应透明现象
comsol 双BIC复现 电磁感应透明在光子晶体波导中实现双连续域束缚态(BIC)总有一种让人又爱又恨的感觉——明明参数稍微跑偏一点就会消失的特性,偏偏在参数调准时又能展现出惊艳的Q值。咱们今天不聊数学推导,直接打开COMSOL手把手…...
