- Spring框架中SpelExpressionParser使用到了解释器模式
| public class Interpreter { |
| public static void main(String[] args) { |
| SpelExpressionParser parser = new SpelExpressionParser(); |
| Expression expression = parser.parseExpression("100 * (2 + 400) * 1 + 66"); |
| int result = (Integer) expression.getValue(); |
| System.out.println(result); |
| } |
| } |
| |
| public interface ExpressionParser { |
| Expression parseExpression(String expressionString) throws ParseException; |
| Expression parseExpression(String expressionString, ParserContext context) throws ParseException; |
| } |
| |
| # 查看实现 |
| public abstract class TemplateAwareExpressionParser implements ExpressionParser { |
| public Expression parseExpression(String expressionString, ParserContext context) { |
| } |
| } |
| |
| public class SpelExpressionParser extends TemplateAwareExpressionParser{} |
| |
| class InternalSpelExpressionParser extends TemplateAwareExpressionParser{} |
| Expression 接口 表达式接口 |
| 下面有不同的实现类,比如SpelExpression, 或者CompositeStringExpression。 |
| 使用时候,根据你创建的不同的Parser 对象,返回不同的 Expression 对象 |
| public Expression parseExpression(String expressionString, ParserContext context) throws ParseException { |
| if (context == null) { |
| context = NON_TEMPLATE_PARSER_CONTEXT; |
| } |
| if (context.isTemplate()) { |
| return parseTemplate(expressionString, context); |
| } |
| else { |
| return doParseExpression(expressionString, context); |
| } |
| } |
| |
| 使用得当 Expression对象,调用getValue 解释执行 表达式,最后得到结果 |
| 1) 当有一个语言需要解释执行,可将该语言中的句子表示为一个抽象语法树,就可以考虑使用解释器模式,让程序具有良好的扩展性 |
| 2) 应用场景:编译器、运算表达式计算、正则表达式、机器人等 |
| 3) 使用解释器可能带来的问题:解释器模式会引起类膨胀、解释器模式采用递归调用方法,将会导致调试非常复杂、效率可能降低 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?