大家好,这里是每周都在陪你一起进步的网管~!今天继续学习设计模式—解释器模式
站在用户的角度思考问题,与客户深入沟通,找到禄丰网站设计与禄丰网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、成都网站设计、企业官网、英文网站、手机端网站、网站推广、国际域名空间、网站空间、企业邮箱。业务覆盖禄丰地区。
解释器模式是一种行为设计模式,可以用来在程序里创建针对一个特点领域语言的解释器,用于处理解释领域语言中的语句。换句话说,该模式定义了领域语言的抽象语法树以及用示来解释语法树的解释器。
解释器模式,用于解决需要解释语言中的句子或表达式的问题。以下是一些可以在 程序中使用解释器模式的真实场景:
许多应用程序使用配置文件来指定应用程序的行为方式。这些配置文件可以用 YAML 或 JSON 等 DSL 编写。解释器可用于解析这些配置文件并以应用编程语言对象的形式向应用程序提供配置信息。
虽然解释器模式可以用来解决这些问题,但它并不总是最好的解决方案。对于复杂的语言,使用特定的解析库或工具或其他设计模式可能更有效。
下面我们先来学习一下解释器模式的结构组成,然后再尝试用代码自己实现一个解释器。
解释器模式中的关键组件有:
下面是解释器模式构成的UML类图:
看完解释器模式的结构组成后,我们接下来尝试应用解释器模式,用代码实现一个加法运算的解释器。
看了上面解释器的结构组成后我们结下来通过代码一步步实现其核心组件来演示怎么用代码实现解释器模式。
以下是如何在 Go 中实现解释器模式的步骤。
这里简单实现一个加减的运算器,我们对每种运算定义对应的Expression对象,在方法里实现具体的运算规则,避免所有的运算操作放到一个函数中,这体现了解释器模式的核心思想,将语法解析的工作拆分到各个小类中,以此来避免大而全的解析类。
我们先按照上面的步骤一,定义数学运算这一领域语言里表示抽象语法树中元素的表达式接口:
type Expression interface {
Interpret() int
}
接下来创建Expression接口的具体实现类,在我们的加减法运算中需要实现操作数、加法、减法对应的实现类。
"本文使用的完整可运行源码
去公众号「网管叨bi叨」发送【设计模式】即可领取"
type NumberExpression struct {
val int
}
// 解释--返回其整数值
func (n *NumberExpression) Interpret() int {
return n.val
}
// 加法运算
type AdditionExpression struct {
left, right Expression
}
// 解释--进行加法操作
func (n *AdditionExpression) Interpret() int {
return n.left.Interpret() + n.right.Interpret()
}
// 减法运算
type SubtractionExpression struct {
left, right Expression
}
// 解释--进行减法运算
func (n *SubtractionExpression) Interpret() int {
return n.left.Interpret() - n.right.Interpret()
}
最后我们创建一个表达式解析器,它会根据输入表达式构造抽象语法树,使用创建的抽象语法树和上下文解释表达式。
"本文使用的完整可运行源码
去公众号「网管叨bi叨」发送【设计模式】即可领取"
type Parser struct {
exp []string
index int
prev Expression
}
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.newAdditionExpression()
case "-":
p.prev = p.newSubtractionExpression()
default:
p.prev = p.newNumberExpression()
}
}
}
func (p *Parser) newAdditionExpression() Expression {
p.index++
return &AdditionExpression{
left: p.prev,
right: p.newNumberExpression(),
}
}
func (p *Parser) newSubtractionExpression() Expression {
p.index++
return &SubtractionExpression{
left: p.prev,
right: p.newNumberExpression(),
}
}
func (p *Parser) newNumberExpression() Expression {
v, _ := strconv.Atoi(p.exp[p.index])
p.index++
return &NumberExpression{
val: v,
}
}
// 返回Expression实例
// 调用Interpret方法会从右向左递归计算出公式结果
func (p *Parser) Result() Expression {
return p.prev
}
最后,我们用使用 Parse 把客户端传递过来的加减法表达式解析成抽象语法树,然后运行解释器计算加减法表达式的结果。
"本文使用的完整可运行源码
去公众号「网管叨bi叨」发送【设计模式】即可领取"
func main() {
p := &Parser{}
p.Parse("1 + 3 + 3 + 3 - 3")
res := p.Result().Interpret()
expect := 7
if res != expect {
log.Fatalf("error: expect %d got %d", expect, res)
}
fmt.Printf("expect: %d, got: %d", expect, res)
}
在程序中使用解释器模式的目标是: 定义特定于领域的语言及其语法,使用 AST(抽象语法树)表示语言中的表达式或句子,好让程序能够根据一组规则或操作解释或评估表达式
最后我们再来列举一下解释器模式的优缺点。 使用解释器模式的优点是:
使用解释器模式的缺点是:
分享标题:Go设计模式--解释器模式
当前链接:http://www.shufengxianlan.com/qtweb/news48/247048.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联