23. 解释器模式(Interpreter)

问题:需要解析和执行某种语言或表达式。

核心:为语法中的每种规则定义一个类,递归解析表达式树。

// 简易数学表达式解释器:支持 数字 + 加法 + 减法
interface Expression {
  interpret(): number;
}

class NumberExpr implements Expression {
  constructor(private value: number) {}
  interpret(): number { return this.value; }
}

class AddExpr implements Expression {
  constructor(private left: Expression, private right: Expression) {}
  interpret(): number { return this.left.interpret() + this.right.interpret(); }
}

class SubtractExpr implements Expression {
  constructor(private left: Expression, private right: Expression) {}
  interpret(): number { return this.left.interpret() - this.right.interpret(); }
}

// (5 + 3) - 2 = 6
const expr = new SubtractExpr(
  new AddExpr(new NumberExpr(5), new NumberExpr(3)),
  new NumberExpr(2)
);

console.log(expr.interpret()); // 6
package interpreter

// 简易数学表达式解释器
type Expression interface {
  Interpret() int
}

type NumberExpr struct{ Value int }

func (n NumberExpr) Interpret() int { return n.Value }

type AddExpr struct {
  Left, Right Expression
}

func (a AddExpr) Interpret() int {
  return a.Left.Interpret() + a.Right.Interpret()
}

type SubtractExpr struct {
  Left, Right Expression
}

func (s SubtractExpr) Interpret() int {
  return s.Left.Interpret() - s.Right.Interpret()
}

// 使用
// expr := SubtractExpr{
//   Left:  AddExpr{Left: NumberExpr{5}, Right: NumberExpr{3}},
//   Right: NumberExpr{2},
// }
// fmt.Println(expr.Interpret()) // 6

实战场景

  • 表达式计算:计算器、报表公式、定价公式需要解析并执行 a + b * c 这类表达式。
  • 规则引擎:用小型 DSL 表达“金额大于 1000 且用户等级为 VIP”,再解释执行。
  • 搜索语法:支持 tag:go status:published keyword 这类查询语法,解析成表达式树后执行。
  • 权限表达式:配置 role=admin or owner=true,运行时根据上下文判断是否允许访问。
  • 模板语言:邮件模板、页面模板、配置模板里的变量、条件和循环可以由解释器处理。
  • 工作流条件:流程节点上的分支条件用简单语言描述,流程引擎解释后决定下一步。
  • 命令脚本:应用内部提供少量命令组合,例如自动化工具、聊天机器人指令、游戏控制台。
  • 数学公式字段:低代码平台允许用户配置字段计算公式,解释器把公式应用到每行数据。
  • 日志过滤:用户输入 level:error AND service:api,解释器把它转换成过滤条件。
  • 配置校验:用 DSL 表达配置约束,例如依赖关系、范围判断、互斥规则,再统一执行。