展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

解释器模式在Spring应用

  • 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) { // 不同情况返回不同的Express. 
    } 
}

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); //返回的就是 CompositeStringExpression
    }
    else {
        return doParseExpression(expressionString, context); //返回的就是 SpelExpression
    }
}

使用得当 Expression对象,调用getValue 解释执行 表达式,最后得到结果
  • 解释器模式的注意事项和细节
1) 当有一个语言需要解释执行,可将该语言中的句子表示为一个抽象语法树,就可以考虑使用解释器模式,让程序具有良好的扩展性
2) 应用场景:编译器、运算表达式计算、正则表达式、机器人等
3) 使用解释器可能带来的问题:解释器模式会引起类膨胀、解释器模式采用递归调用方法,将会导致调试非常复杂、效率可能降低
posted @ 2022-09-01 14:05  DogLeftover  阅读(73)  评论(0编辑  收藏  举报