23. 解释器模式(Interpreter)
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()); // 6package 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 表达配置约束,例如依赖关系、范围判断、互斥规则,再统一执行。