解释器模式

9.1 模式动机

解释器模式定义一套语言文法,并设计该语言解释器,使用户能使用特定文法控制解释器行为。

解释器模式的意义在于,它分离多种复杂功能的实现,每个功能只需关注自身的解释。

对于调用者不用关心内部的解释器的工作,只需要用简单的方式组合命令就可以。

9.2 Go语言实现

interpreter.go

  1. package interpreter
  2. import (
  3. "strconv"
  4. "strings"
  5. )
  6. type Node interface {
  7. Interpret() int
  8. }
  9. type ValNode struct {
  10. val int
  11. }
  12. func (n *ValNode) Interpret() int {
  13. return n.val
  14. }
  15. type AddNode struct {
  16. left, right Node
  17. }
  18. func (n *AddNode) Interpret() int {
  19. return n.left.Interpret() + n.right.Interpret()
  20. }
  21. type MinNode struct {
  22. left, right Node
  23. }
  24. func (n *MinNode) Interpret() int {
  25. return n.left.Interpret() - n.right.Interpret()
  26. }
  27. type Parser struct {
  28. exp []string
  29. index int
  30. prev Node
  31. }
  32. func (p *Parser) Parse(exp string) {
  33. p.exp = strings.Split(exp, " ")
  34. for {
  35. if p.index >= len(p.exp) {
  36. return
  37. }
  38. switch p.exp[p.index] {
  39. case "+":
  40. p.prev = p.newAddNode()
  41. case "-":
  42. p.prev = p.newMinNode()
  43. default:
  44. p.prev = p.newValNode()
  45. }
  46. }
  47. }
  48. func (p *Parser) newAddNode() Node {
  49. p.index++
  50. return &AddNode{
  51. left: p.prev,
  52. right: p.newValNode(),
  53. }
  54. }
  55. func (p *Parser) newMinNode() Node {
  56. p.index++
  57. return &MinNode{
  58. left: p.prev,
  59. right: p.newValNode(),
  60. }
  61. }
  62. func (p *Parser) newValNode() Node {
  63. v, _ := strconv.Atoi(p.exp[p.index])
  64. p.index++
  65. return &ValNode{
  66. val: v,
  67. }
  68. }
  69. func (p *Parser) Result() Node {
  70. return p.prev
  71. }

interpreter_test.go

  1. package interpreter
  2. import "testing"
  3. func TestInterpreter(t *testing.T) {
  4. p := &Parser{}
  5. p.Parse("1 + 2 + 3 - 4 + 5 - 6")
  6. res := p.Result().Interpret()
  7. expect := 1
  8. if res != expect {
  9. t.Fatalf("expect %d got %d", expect, res)
  10. }
  11. }