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

GO设计模式——17、解释器模式(行为型)

目录

解释器模式(Interpreter Pattern)

解释器模式的核心角色:

优缺点

代码实现


解释器模式(Interpreter Pattern)

        解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

解释器模式核心角色

  • 抽象表达式(Abstract Expression):定义了抽象的解释器接口,用来解释语言中的元素,可以是终止符,也可以是非终止符。
  • 终止符表达式(Terminal Expression):实现了抽象表达式中的解释器接口,用来存储语言中的终止符,它们不需要再次解释,通常会返回具体的结果。
  • 非终止符表达式(Nonterminal Expression):也实现了抽象表达式中的解释器接口,用来存储语言中的非终止符。
  • 上下文(Context):存储解释器解释的信息,并调用解释器进行解释。

优缺点

(1)优点:

  • 可扩展性比较好,灵活。
  • 增加了新的解释表达式的方式。
  • 易于实现简单文法。

(2)缺点:

  • 可利用场景比较少。
  • 对于复杂的文法比较难维护。
  • 解释器模式会引起类膨胀。
  • 解释器模式采用递归调用方法。

代码实现

package mainimport ("fmt""strconv""strings"
)// 解释器接口
type Node interface {Interpret() int //解释方法
}// 数据节点
type ValNode struct {val int
}func (vn *ValNode) Interpret() int {return vn.val
}// =============加法节点=============
type AddNode struct {left, right Node
}func (an *AddNode) Interpret() int {return an.left.Interpret() + an.right.Interpret()
}// =============减法节点=============
type SubNode struct {left, right Node
}func (an *SubNode) Interpret() int {return an.left.Interpret() - an.right.Interpret()
}// =============解释对象=============
type Parser struct {exp   []string //表达式index int      //索引prev  Node     //前序节点
}func (p *Parser) newValNode() Node { //执行数据操作v, _ := strconv.Atoi(p.exp[p.index])p.index++return &ValNode{val: v}
}
func (p *Parser) newAddNode() Node { //执行加法操作( + )p.index++return &AddNode{left:  p.prev,right: p.newValNode(),}
}
func (p *Parser) newSubNode() Node { //执行减法操作( - )p.index++return &SubNode{left:  p.prev,right: p.newValNode(),}
}
func (p *Parser) Result() Node { //返回结果return p.prev
}
func (p *Parser) Parse(exp string) { //对表达式进行解析p.exp = strings.Split(exp, " ") //通过空格分割for {if p.index >= len(p.exp) {return}switch p.exp[p.index] {case "+":p.prev = p.newAddNode()case "-":p.prev = p.newSubNode()default:p.prev = p.newValNode()}}
}
func main() {p := Parser{}p.Parse("1 + 2 + 3 - 4 + 10") //是通过空格进行解释的fmt.Println(p.Result().Interpret())
}
http://www.lryc.cn/news/265541.html

相关文章:

  • 基于SSM的大学生兼职平台的设计与实现
  • Ignite内存配置
  • 前端基础vue路由懒加载
  • C++系列第九篇 数据类型下篇 - 复合类型(指针高级应用)
  • python三大开发框架django、 flask 和 fastapi 对比
  • html基础2
  • 基于博弈树的开源五子棋AI教程[5 启发式搜索]
  • JavaScript原型,原型链 ? 有什么特点?
  • Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题
  • linux 中 C++的环境搭建以及测试工具的简单介绍
  • 448. 找到所有数组中消失的数字
  • 为何在下雪天它“失宠”了,传统雪地靴居然不适合下雪穿
  • 第34节: Vue3 调用内联处理程序中的方法
  • JavaScript--明明白白Promise (Park One)
  • el-form与el-upload结合上传带附件的表单数据(后端篇)
  • postMessage——不同源的网页直接通过localStorage/sessionStorage/Cookies——技能提升
  • 上市公司-绿色投资者数据集(2000-2022)
  • 3 pandas之dataframe
  • vue-内网,离线使用百度地图(地图瓦片图下载静态资源展示定位)
  • OpenFeign 万字教程详解
  • 全自动双轴晶圆划片机:半导体制造的关键利器
  • Android Studio 安装和使用
  • 【已解决】Java中,判断:集合中是否包含指定元素(模糊匹配)比如权限中的user:list或者是user:*这种判断
  • 【基于激光雷达的路沿检测用于自动驾驶的真值标注】
  • 【Spring实战】配置多数据源
  • DevOps系列文章 : 使用dpkg命令打deb包
  • linux sed命令操作大全
  • Vue2+Vue3组件间通信方式汇总(3)------$bus
  • 前端基础location的使用
  • Android JNI入门到基础