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

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

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/

图片

往期文章回顾:

  1. 设计模式

  2. 招聘

  3. 思考

  4. 存储

  5. 算法系列

  6. 读书笔记

  7. 小工具

  8. 架构

  9. 网络

  10. Go语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员麻辣烫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值