1. 数学表达式计算
- 场景描述:解析并计算用户输入的数学表达式(如
3 + 5 * 2
),无需依赖内置计算函数。 - 实现方式:通过终结符(数字)和非终结符(加减乘除)构建抽象语法树(AST),递归解释计算。
- 示例:
Expression expression = new AddExpression(new NumberExpression(2), new MultiplyExpression(3, 4)); int result = expression.interpret(); // 输出 14
2. 规则引擎与业务逻辑解析
- 场景描述:动态解析业务规则(如促销条件
金额 > 100 && 类别 == "电器"
),实现灵活的策略控制。 - 实现方式:定义逻辑运算符(AND/OR)和终结符(变量),构建组合式表达式树。
- 示例:
Expression rule = new AndExpression(new TerminalExpression("VIP"), new CompareExpression(">100")); boolean isQualified = rule.interpret(context); // 根据上下文变量判断
3. 配置文件与DSL解析
- 场景描述:解析自定义配置文件(如XML、JSON)或领域特定语言(DSL),转换为程序可操作的对象。
- 典型应用:Spring框架的
SpEL
(表达式语言)动态注入配置值。
4. SQL与正则表达式引擎
- 场景描述:实现轻量级SQL解析器或正则表达式匹配逻辑。
- 底层原理:通过词法分析生成终结符,语法分析构建非终结符树,最终解释执行。
- Java内置应用:
java.util.regex
包的正则引擎基于解释器模式实现。
5. 编译器与解释器前端
- 场景描述:在编译器设计中,完成词法分析(生成Token)和语法分析(构建AST)。
- 示例流程:
输入字符串 "a=10; b=20; a+b" → 词法分析为终结符 → 语法分析生成表达式树 → 解释执行。
6. 模板引擎与字符串渲染
- 场景描述:解析模板中的占位符(如
{{username}}
),替换为动态数据。 - 实现关键:上下文(Context)存储变量值,终结符表达式获取变量,非终结符组合输出。
7. Spring框架的扩展应用
SpEL表达式:在Spring Security中定义权限规则,或在Spring Integration中处理消息路由。
- 示例代码:
// 解析表达式并获取值 ExpressionParser parser = new SpelExpressionParser(); int result = parser.parseExpression("2 + 3 * 4").getValue(Integer.class); // 输出14
适用性与注意事项
- 何时使用:
- 语法规则简单且需频繁扩展(如新增运算符)。
- 需要动态解析用户输入的规则或表达式。
- 何时避免:
- 复杂语法(推荐使用ANTLR等专业解析工具)。
- 性能敏感场景(递归解释可能效率较低)。
通过上述场景可以看出,解释器模式的核心优势在于灵活性与可扩展性,但需权衡其与性能、维护成本的关系。实际开发中,可结合组合模式构建语法树,或与缓存机制优化性能。