解释器模式
解释器(Interpreter)模式的定义: 给分析对象定义一个语言,并定义该语言的文法表示,
再设计一个解析器来解释语言中的句子.也就是说,用编译语言的方式来分析应用中的实例.
这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文.
优点 和 缺点
优点:
- 可扩展性比较好
- 增加了新的解释表达式的方式
缺点:
- 利用场景比较少
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| type Node interface { Interpret() int }
type ValNode struct { val int }
func (n *ValNode) Interpret() int { return n.val }
type AddNode struct { left, right Node }
func (n *AddNode) Interpret() int { return n.left.Interpret() + n.right.Interpret() }
type MinNode struct { left, right Node }
func (n *MinNode) Interpret() int { return n.left.Interpret() - n.right.Interpret() }
type Parser struct { exp []string index int prev Node }
func (p *Parser) Parse(exp string) { p.exp = strings.Split(exp, " ")
for { if p.index >= len(p.exp) { return } switch p.exp[p.index] { case "+": p.prev = p.newAddNode() case "-": p.prev = p.newMinNode() default: p.prev = p.newValNode() } } }
func (p *Parser) newAddNode() Node { p.index++ return &AddNode{ left: p.prev, right: p.newValNode(), } }
func (p *Parser) newMinNode() Node { p.index++ return &MinNode{ left: p.prev, right: p.newValNode(), } }
func (p *Parser) newValNode() Node { v, _ := strconv.Atoi(p.exp[p.index]) p.index++ return &ValNode{ val: v, } }
func (p *Parser) Result() Node { return p.prev }
|