
解释器模式给规则语言写一个解释器业务规则、表达式计算、查询条件、模板语法本质上都是“一门小语言”。解释器模式把语法规则翻译成可执行的对象树。一、痛点规则硬编码变化起来很痛苦一个风控系统需要判断用户年龄大于 18且账户状态为正常且近 7 天登录次数大于 3如果直接把规则写成 Java 代码if(age18accountStatus.equals(NORMAL)loginCount3){// 通过}规则一变就要改代码、重新发布。业务人员也没法自己维护规则。解释器模式的回答把规则表达成可以被解析的表达式再把表达式结构映射成对象树通过递归求值得到结果。二、实现表达式接口 → 终结符/非终结符 → 解析求值以最简单的布尔表达式为例支持true、false、and、or、not。第一步定义表达式接口publicinterfaceExpression{booleaninterpret(Contextcontext);}这里先简化不需要 ContextpublicinterfaceExpression{booleanevaluate();}第二步终结符表达式publicclassBooleanLiteralimplementsExpression{privatefinalbooleanvalue;publicBooleanLiteral(booleanvalue){this.valuevalue;}Overridepublicbooleanevaluate(){returnvalue;}}第三步非终结符表达式publicclassAndExpressionimplementsExpression{privatefinalExpressionleft;privatefinalExpressionright;publicAndExpression(Expressionleft,Expressionright){this.leftleft;this.rightright;}Overridepublicbooleanevaluate(){returnleft.evaluate()right.evaluate();}}publicclassOrExpressionimplementsExpression{privatefinalExpressionleft;privatefinalExpressionright;publicOrExpression(Expressionleft,Expressionright){this.leftleft;this.rightright;}Overridepublicbooleanevaluate(){returnleft.evaluate()||right.evaluate();}}第四步构造表达式树ExpressionrulenewAndExpression(newBooleanLiteral(true),newOrExpression(newBooleanLiteral(false),newBooleanLiteral(true)));System.out.println(rule.evaluate());// true真实系统中rule不应由 Java 代码手动拼而应由解析器把字符串规则转换为这棵表达式树。三、真实落地需要更多组件解释器模式的核心是“解释”但生产级规则系统还要具备组件作用词法分析器把字符串拆成 Token语法分析器把 Token 构造成抽象语法树上下文保存变量、环境、中间结果求值器递归遍历语法树计算结果像正则表达式、SQL、EL 表达式、规则引擎底层都使用了类似思想。四、适用边界与替代方案解释器模式适合规则简单、语法稳定、变化频率可控的场景。如果规则非常复杂或频繁变化直接使用成熟规则引擎如 Drools、表达式语言SpEL、Aviator通常更务实。手写解释器要谨慎它容易带来解析器维护成本、性能损耗和递归深度问题。小结解释器模式一句话用对象树表示语法用递归求值解释规则。它让“规则变化”从改 Java 代码走向改表达式适合小而稳定的领域语言。