设计模式——解释器模式

什么是解释器模式?

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

实现

// Context 环境角色
type Context struct {
}

func NewContext() *Context {
    return &Context{}
}

// 抽象表达式类
type Expression interface {
    Interpreter(ctx Context)
}

// 终端解析器
type TerminalExpression struct {
}

func NewTerminalExpression() *TerminalExpression {
    return &TerminalExpression{}
}

func (this *TerminalExpression) Interpreter(ctx Context) {
    fmt.Println("终端解释器")
}

// 非终端解析器
type NonterminalExpression struct {
}

func NewNonterminalExpression() *NonterminalExpression {
    return &NonterminalExpression{}
}

func (this *NonterminalExpression) Interpreter(ctx Context) {
    fmt.Println("非终端解释器")
}
func TestNewTerminalExpression(t *testing.T) {
    ctx := NewContext()
    expList := []Expression{}
    expList = append(expList, NewTerminalExpression())
    expList = append(expList, NewNonterminalExpression())
    expList = append(expList, NewTerminalExpression())
    expList = append(expList, NewNonterminalExpression())
    expList = append(expList, NewNonterminalExpression())

    for _, exp := range expList {
        exp.Interpreter(*ctx)
    }
}
/*
=== RUN   TestNewTerminalExpression
终端解释器
非终端解释器
终端解释器
非终端解释器
非终端解释器
--- PASS: TestNewTerminalExpression (0.00s)
PASS
*/

优点

  • 可扩展性好。

缺点

  • 解释器模式会引起类膨胀;

  • 解释器模式采用递归调用方法,将会导致调试非常复杂;

  • 使用了大量的循环和递归,效率是一个不容忽视的问题。

使用场景

  • 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树;
  • 一些重复出现的问题可以用一种简单的语言来表达;
  • 一个简单语法需要解释的场景。

注意

  • 尽量不要在重要的模块中使用解释器模式,否则维护会是一个很大的问题。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容