设计模式-解释器模式

设计模式-解释器模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ITSj42S0-1660630745880)(https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTRLIW2DTSlwZxK5KPwgN3Pbf4vfe_-onimLA&usqp=CAU)]

参考


解释器模式提供了评估语言的语法或表达式的方式,它属于行为模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。

使用场景

  • 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
  • 一个简答语法需要解释的场景

Demo分析

当我们需要一个特别的翻译器,需要对音乐、舞蹈等进行翻译,将这些艺术形式翻译为我们熟知的语言。此时我们可以利用解释器模式将不同的解析方式拆分到各个小类中从而达到解耦。

Go实现

package main

import "fmt"

/**
* 内容信息
 */
type Context struct {
	action  string
	context string
}

/**
* 翻译接口
 */
type InterPreter interface {
	Interpret(context Context)
}

type MusicInterpreter struct {
}

/**
* 音乐翻译器
 */
func (m *MusicInterpreter) Interpret(context Context) {
	fmt.Printf("%s 中的 %s 的意思是温婉尔雅\n", context.action, context.context)
}

/**
* 舞蹈翻译器
 */
type DanceInterpreter struct {
}

func (d *DanceInterpreter) Interpret(context Context) {
	fmt.Printf("%s 中的 %s 意境很ok \n", context.action, context.context)
}

func test() {
	actionList := []Context{
		{action: "music", context: "高音"},
		{action: "music", context: "低音"},
		{action: "dance", context: "跳跃"},
		{action: "dance", context: "旋转"},
	}
	for _, c := range actionList {
		if c.action == "music" {
			(&MusicInterpreter{}).Interpret(c)
		} else if c.action == "dance" {
			(&DanceInterpreter{}).Interpret(c)
		}
	}
}

func main() {
	test()
}

输出

music 中的 高音 的意思是温婉尔雅
music 中的 低音 的意思是温婉尔雅
dance 中的 跳跃 意境很悲凉
dance 中的 旋转 意境很悲凉

Python实现

class Context(object):
  def __init__(self, action ,context):
    self.action = action
    self.context = context

class InterPreter(object):
  """
    ## 翻译类的接口
  """
  def InterPreter(self, context):
    pass

class MusicInterpreter(InterPreter):
  """
    ## 音乐翻译类
  """
  def InterPreter(self, context):
    print(f"{context.action} 中的 {context.context} 很好听")    

class MovieInterpreter(InterPreter):
  """
    ## 电影翻译类
  """
  def InterPreter(self, context):
    print(f"{context.action} 中的 {context.context} 很好看")

def test():
  actionList = [
    Context("music", "高音"),
    Context("music", "低音"),
    Context("movie", "电影"),
  ]
  for c in actionList:
    if c.action == "music":
      MusicInterpreter().InterPreter(c)
    elif c.action == "movie":
      MovieInterpreter().InterPreter(c)

if __name__ == '__main__':
  test()

输出

music 中的 高音 很好听
music 中的 低音 很好听
movie 中的 电影 很好看

小结

解释器模式的主要作用解释分而治之,将同一功能的不同细分功能分开进行管理,方便了解释器的扩展和维护。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值