解释器模式(Interpreter Design Pattern)

解释器模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式常被用在SQL解析、代码编译器、符号处理引擎等,它是一种针对特定问题而设计的解决方案。

代码示例

例如给计算器一个字符串的表达式 "1+10",计算器要先把数字和操作符解析出来,然后按照操作符的优先级,再由不同的操作符解释器去处理,这里以加法解释器为例:

package interpreter

import (
    "strconv"
    "strings"
)

type Expression interface {
    Interpret() int
}

//加法处理器
type AddExpression struct {
    expr1 Expression
    expr2 Expression
}

func NewAddExpression(expr1, expr2 NumberExpression) *AddExpression {
    return &AddExpression{
        expr1: expr1,
        expr2: expr2,
    }
}
func (add AddExpression) Interpret() int {
    return add.expr1.Interpret() + add.expr2.Interpret()
}

//数字处理器
type NumberExpression struct {
    num int
}

func NewNumberExpression(expression string) *NumberExpression {
    num, _ := strconv.Atoi(strings.Trim(expression, " "))
    return &NumberExpression{
        num: num,
    }
}

func (exp NumberExpression) Interpret() int {
    return exp.num
}

//计算器
type Calculator struct {
    expression string
}

func NewCalculator(expression string) *Calculator {
    return &Calculator{expression: expression}
}

func (c Calculator) Calculate() int {
    var expr1 *NumberExpression
    var expr2 *NumberExpression
    for i, s := range c.expression {
        switch s {
        case '+':
            expr1 = NewNumberExpression(c.expression[0 : i-1])
            expr2 = NewNumberExpression(c.expression[i+1 : len(c.expression)])
        }
    }
    if expr1 != nil && expr2 != nil {
        addExpr := NewAddExpression(*expr1, *expr2)
        return addExpr.Interpret()
    }
    return 0
}

调用:

calc := NewCalculator("1 + 10")
result := calc.Calculate()
fmt.Println(result)

// Output:
// 11

results matching ""

    No results matching ""