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

《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 类图

Context
AbstractExpression
TerminalExpression
+Interpret(con:Context)
NoTerminalExpression
+Interpret(con:Context)
Client

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 类图

Client
+context:Context
+prev:Node
+CreateNode(expString string) : Node
+CreateAddNode() : Node
+CreateSubNode() : Node
+CreateValNode() : Node
Context
+exp:[]string
+index:int
+GetList(exp string)
«interface»
Node
+Interpreter() : int
ValNode
+val:int
+Interpreter() : int
AddNode
+left:Node
+right:Node
+Interpreter() : int
SubNode
+left:Node
+right:Node
+Interpreter() : int

相关文章:

《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

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…...

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&#xff1a…...

二十二、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常见的技术问题和解答

随着互联网的快速发展&#xff0c;数据获取变得越来越重要。爬虫API作为一种高效的数据获取手段&#xff0c;被广泛应用于各种场景。然而&#xff0c;在实际使用过程中&#xff0c;我们经常会遇到一些技术问题。本文将详细介绍爬虫API的常见技术问题及相应的解决方案。 一、爬…...

在CentOS上用yum方式安装MySQL8过程记录

此文参考官方文档一步一步记录安装到正常运行全过程 安装环境&#xff1a;centos7 mysql版本&#xff1a;8.0.35 安装过程主要参考下面两边文章&#xff1a; 1.官方文档 https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html 2.linux yum安装mysql8 安…...

CEYEE希亦新品洗地机Pro系列发布, 领跑行业的「水汽混动」技术的旗舰新杰作

CEYEE希亦全新一代洗地机T800 PRO正式上市&#xff0c;采用双滚刷&#xff0c;双倍活水洗拖洗方式&#xff0c;达到拖一遍抵两遍&#xff0c;相对于10倍洁净效果&#xff01; 这款希亦Pro系列产品不仅刷新了洗地机行业技术水准&#xff0c;满足了用户愈发极致的清洁效能追求&a…...

为什么要安装防静电门禁闸机

安装防静电门禁闸机可以带来以下几个方面的好处&#xff1a; 防止静电干扰&#xff1a;静电是一种非常危险的物理现象&#xff0c;它可以对电子元器件、电路板和其他敏感设备造成损害&#xff0c;甚至导致设备故障和生产中断。防静电门禁闸机可以有效地防止静电的产生和传导&am…...

[linux] shell中的()和{}

参考&#xff1a;https://www.cnblogs.com/cheer-lingmu/p/16467561.html 参考&#xff1a;shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)_linux shell_脚本之家 一、小括号() 1、命令替换&#xff1a;等同于cmd&#xff0c;shell扫描一遍命令行&#xff0c;发现了…...

jdk官网下载(详细步骤)

jdk全部版本下载网址 Java Archive | Oraclehttps://www.oracle.com/java/technologies/downloads/archive/ 下载之前先建立oracle账号(免费创建)&#xff0c;不用特意去搜&#xff0c;你点击下载jdk的时候会自动弹出来&#xff0c;自己建立一个账号就能下载了 找到自己要下载…...

10.24 校招 实习 内推 面经

绿*泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 吉利控股集团2024届全球校园招聘路特斯科技专场&#xff08;内推&#xff09; 校招 | 吉利控股集团2024届全球校园招聘路特斯科技专场&#xff08;内推&#xff09; 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…...

Topit:macOS窗口置顶神器,让多任务处理效率翻倍

Topit&#xff1a;macOS窗口置顶神器&#xff0c;让多任务处理效率翻倍 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 你是否经常在macOS上同时处理多个任务时…...

2026 新视角:化妆品开发的底层逻辑,做好一款产品,从选对原料开始

在化妆品研发链条中&#xff0c;配方架构、生产工艺、包装设计固然重要&#xff0c;但决定一款产品上限的&#xff0c;永远是原料。一款稳定、安全、表现优异的护肤成品&#xff0c;离不开纯净、达标、批次一致的优质原料。对于品牌方、配方师、代工企业而言&#xff0c;原料不…...

2026上半年数据库系统工程师(软考)上午题回忆与解析(非标答版)

本文为考后回忆整理&#xff0c;非官方标准答案&#xff0c;旨在为考后对答案及下半年备考的同学提供参考。题目顺序和表述可能与原卷有出入&#xff0c;欢迎在评论区指正、补充。&#x1f4ca; 整体考情分析 刚结束的2026年上半年数据库系统工程师考试&#xff0c;上午题的风格…...

第三卷第4章:原型模式设计思想

第三卷第4章:原型模式设计思想 目录介绍 01.案例引入与思考 1.1 痛点场景 1.2 它哪里不舒服 1.3 引出本篇主角 02.原型模式介绍 2.1 原型模式由来 2.2 原型模式定义...

通过curl命令快速测试Taotoken大模型API的连通性与返回格式

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过curl命令快速测试Taotoken大模型API的连通性与返回格式 在集成大模型能力到应用时&#xff0c;开发者通常需要一种快速、轻量的…...

终极歌词同步神器LRCGET:5分钟为你的音乐库添加完美歌词

终极歌词同步神器LRCGET&#xff1a;5分钟为你的音乐库添加完美歌词 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 你是否厌倦了在听歌时手动搜索歌词…...

别再只用鼠标了!用Leap Motion手势控制Unity游戏,保姆级配置避坑指南(2024版)

2024年Unity手势交互开发实战&#xff1a;Leap Motion从配置到游戏逻辑全解析在游戏开发领域&#xff0c;交互方式的创新往往能带来全新的体验。想象一下&#xff0c;玩家不再需要键盘鼠标&#xff0c;仅凭自然的手部动作就能操控游戏角色——这正是Leap Motion手势识别技术为U…...

Frida无Root Hook PC微信小程序源码(Electron+Chromium)

1. 这不是“破解”&#xff0c;而是一次对微信小程序运行机制的逆向观察 你有没有试过&#xff0c;在PC版微信里点开一个小程序&#xff0c;想看看它背后是怎么写的&#xff1f;比如某个电商小程序的优惠券逻辑、某个工具类小程序的数据渲染方式&#xff0c;甚至只是单纯好奇—…...

在数据预处理与分析流水线中集成大模型API进行智能标注与摘要

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在数据预处理与分析流水线中集成大模型API进行智能标注与摘要 对于数据工程师而言&#xff0c;处理海量非结构化文本数据是一项常见…...

国产大模型新王登基?Qwen3.7-Max全球第五、编程Agent登顶,千问APP免费体验全攻略

AI前线观察 | 2026.05.25 就在刚刚过去的阿里云峰会上&#xff0c;通义千问甩出了一张“王炸”。万亿参数MoE架构的旗舰模型Qwen3.7-Max正式接入千问APP、PC端及网页端。这不仅仅是一次版本更新&#xff0c;更是国产大模型在权威第三方榜单中首次稳居全球前五、国产第一的里程碑…...