Go设计模式(27)-解释器模式

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 解释器模式可以描述如何构建一个简单的“语言”解释器。这个模式只在一些特定的领域才有可能用到,如编译器、规则引擎、正则表达式等。好在解释器模式比较简单,大家可以了解一下。

解释器模式可以描述如何构建一个简单的“语言”解释器。这个模式只在一些特定的领域才有可能用到,如编译器、规则引擎、正则表达式等。好在解释器模式比较简单,大家可以了解一下。

UML类图位置:https://www.processon.com/view/link/60d29bf3e401fd49502afd25

本文代码链接为:https://github.com/shidawuhen/asap/blob/master/controller/design/27interpreter.go

1.定义

1.1解释器模式

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

UML:

图片

1.2分析

通过定义可以看出,“语言”必然存在规则,而且规则可能相对复杂。对于每一条规则,可以设置对应的类来翻译。

模式定义与UML完全对应,解释器Expression用于翻译Context,由于Context包含内容类型不同,对这些不同类型的内容创建不同解释器进行解释。

举个例子,假设定义一个新的加减乘除语言,对于 8 + 2 - 5这种情况,新的语言为 8 2 5 + -。在这个例子中,Context就是8 2 5 + -,新语言包含数字和运算符,我们就可以创建数字解释器和运算符解释器,对数字和运算符进行解释。

为什么要用解释器模式呢?

主要是为了将语法解析的工作拆分到各个小类中,以此来避免大而全的解析类。

如果打算用解释器模式,一般的做法是,将语法规则拆分成一些小的独立的单元,然后对每个单元进行解析,最终合并为对整个语法规则的解析。

2.应用场景

解释器模式一般用于编译器、规则引擎、正则表达式,这些功能实现起来都比较麻烦,就不实现它们了。

在实际生活中,我对于中文、英文、编程语言都有一些了解,所以能够解释、理解它们。但对于音乐、舞蹈,根本不知道怎么欣赏。

所以看歌舞表演的时候,特别想有一款翻译器,能对音乐、舞蹈进行翻译,让我了解创作者想表达什么。而且查看解释器源码我也能知道音乐、舞蹈的一般规则,更便于今后的学习。

3.代码实现

现在让我们开始翻译歌舞剧!

package main

import "fmt"

/**
 * @Author: Jason Pang
 * @Description: 内容信息
 */
type Context struct {
   action  string
   content string
}

/**
 * @Author: Jason Pang
 * @Description: 翻译接口
 */
type Interpreter interface {
   Interpret(c Context)
}

/**
 * @Author: Jason Pang
 * @Description: 翻译音乐
 */
type MusicInterpreter struct {
}

/**
 * @Author: Jason Pang
 * @Description: 翻译音乐内容
 * @receiver m
 * @param c
 */
func (m MusicInterpreter) Interpret(c Context) {
   fmt.Println(c.action + " 中 " + c.content + " 的意思是感情高昂")
}

/**
 * @Author: Jason Pang
 * @Description: 翻译舞蹈
 */
type DanceInterpreter struct {
}

/**
 * @Author: Jason Pang
 * @Description: 翻译舞蹈内容
 * @receiver d
 * @param c
 */
func (d DanceInterpreter) Interpret(c Context) {
   fmt.Println(c.action + " 中 " + c.content + " 的意思是悲凉")
}

func main() {
   cList := []Context{
      {action: "music", content: "高音"},
      {action: "music", content: "低音"},
      {action: "dance", content: "跳跃"},
      {action: "dance", content: "挥手"},
   }
   //对歌舞剧内容进行翻译
   for _, c := range cList {
      if c.action == "music" {
         MusicInterpreter{}.Interpret(c)
      } else if c.action == "dance" {
         DanceInterpreter{}.Interpret(c)
      }
   }
}

输出:

➜ myproject go run main.go

music 中 高音 的意思是感情高昂

music 中 低音 的意思是感情高昂

dance 中 跳跃 的意思是悲凉

dance 中 挥手 的意思是悲凉

总结

解释器模式主要是分而治之,将翻译功能分开管理,方便维护。翻译器模式理解难度和使用难度不大,主要是使用场景比较受限。

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

我的个人博客为:https://shidawuhen.github.io/

相关文章
|
2月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
3月前
|
设计模式 Go
go 设计模式之观察者模式
go 设计模式之观察者模式
|
4月前
|
设计模式 Go
Go语言设计模式:使用Option模式简化类的初始化
在Go语言中,面对构造函数参数过多导致的复杂性问题,可以采用Option模式。Option模式通过函数选项提供灵活的配置,增强了构造函数的可读性和可扩展性。以`Foo`为例,通过定义如`WithName`、`WithAge`、`WithDB`等设置器函数,调用者可以选择性地传递所需参数,避免了记忆参数顺序和类型。这种模式提升了代码的维护性和灵活性,特别是在处理多配置场景时。
72 8
|
6月前
|
设计模式 SQL Java
【设计模式】抖音一面:你不知道解释器模式?
【设计模式】抖音一面:你不知道解释器模式?
51 1
|
6月前
|
设计模式 Go
[设计模式 Go实现] 结构型~享元模式
[设计模式 Go实现] 结构型~享元模式
|
6月前
|
设计模式 Go API
[设计模式 Go实现] 结构型~外观模式
[设计模式 Go实现] 结构型~外观模式
|
6月前
|
设计模式 Go
[设计模式 Go实现] 结构型~组合模式
[设计模式 Go实现] 结构型~组合模式
|
6月前
|
设计模式 Go
[设计模式 Go实现] 结构型~装饰模式
[设计模式 Go实现] 结构型~装饰模式
|
6月前
|
设计模式 Go
[设计模式 Go实现] 行为型~解释器模式
[设计模式 Go实现] 行为型~解释器模式
|
6月前
|
设计模式 Go 网络安全
[设计模式 Go实现] 结构型~代理模式
[设计模式 Go实现] 结构型~代理模式